【问题标题】:How do you listen for custom events in Polymer Dart 1.0?你如何在 Polymer Dart 1.0 中监听自定义事件?
【发布时间】:2015-10-27 07:20:57
【问题描述】:

我一直在尝试在 Polymer Dart 1.0 元素中执行以下操作

@PolymerRegister('some-element')
class SomeElement extends PolymerElement {
    ...
    void fireEvent() {
        fire('someevent');
    }
    ...
}

然后我以这种方式听它

<some-element on-someevent="handleSomeEvent"></some-element>

使用我在定义的聚合物元素中定义的方法

@reflectable
void handleSomeEvent([_, __]) {
    ...
}

问题是我得到了一个

Unhandled exception

这没有帮助,我花了一段时间才弄清楚是上面的原因造成的。如果我删除

@reflectable

来自事件处理程序方法的注释,我得到以下内容

method `registered` not defined

我想知道 Polymer Dart 1.0 中是否有处理自定义事件的特殊方法?

我可以这样处理

on['someevent'].listen(handleSomeEvent);

这确实有效,只是我不明白为什么我不能同时处理它。我想我会提交一个关于这个的错误报告,但我想我会把它放在这里并检查我是否正确地完成了这个,因为我做了什么,除了使用

@可反射

这是 Polymer Dart 1.0 特有的,是他们说你应该在 Polymer JS 中做的事情,其文档可以在 here 找到

更新 我应该澄清一下,这个异常发生在加载时,当元素被注册时。等我有更多时间的时候,我会放完整的例外。

我得到的异常如下

Exception: Uncaught Error: Unhandled exception:
Reflecting on un-marked type 'JsObjectImpl'
#0      _InstanceMirrorImpl._InstanceMirrorImpl (package:reflectable/src/reflectable_transformer_based.dart:150:9)
#1      ReflectableImpl.reflect (package:reflectable/src/reflectable_transformer_based.dart:1216:16)
#2      _setupReflectableMethods.<anonymous closure>.<anonymous closure> (package:polymer/src/common/polymer_descriptor.dart:151:49)
#3      JsObject._callMethod (dart:js:678)
#4      JsObject.callMethod (dart:js:618)
#5      PolymerRegister.initialize (package:polymer/src/common/polymer_register.dart:19:13)
#6      loadInitializers.<anonymous closure>.<anonymous closure> (package:initialize/src/static_loader.dart:46:32)
#7      _runInitQueue (package:initialize/initialize.dart:35:24)
#8      _runInitQueue.<anonymous closure> (package:initialize/initialize.dart:38:26)
#9     _RootZone.runUnary (dart:async/zone.dart:1165)
#10     _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:502)
#11     _Future._propagateToListeners (dart:async/future_impl.dart:585)
#12     _Future._completeWithValue (dart:async/future_impl.dart:376)
#13     _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:430)
#14     _microtaskLoop (dart:async/schedule_microtask.dart:43)
#15     _microtaskLoopEntry (dart:async/schedule_microtask.dart:52)
#16     _ScheduleImmediateHelper._handleMutation (dart:html:42565)
Stack Trace:
#0      JsObject._callMethod (dart:js:678)
#1      JsObject.callMethod (dart:js:618)
#2      PolymerRegister.initialize (package:polymer/src/common/polymer_register.dart:19:13)
#3      loadInitializers.<anonymous closure>.<anonymous closure> (package:initialize/src/static_loader.dart:46:32)
#4      _runInitQueue (package:initialize/initialize.dart:35:24)
#5      _runInitQueue.<anonymous closure> (package:initialize/initialize.dart:38:26)
#6      _RootZone.runUnary (dart:async/zone.dart:1165)
#7      _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:502)
#8      _Future._propagateToListeners (dart:async/future_impl.dart:585)
#9      _Future._completeWithValue (dart:async/future_impl.dart:376)
#10     _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:430)
#11     _microtaskLoop (dart:async/schedule_microtask.dart:43)
#12     _microtaskLoopEntry (dart:async/schedule_microtask.dart:52)
#13     _ScheduleImmediateHelper._handleMutation (dart:html:42565)

更多信息

下次我寻求帮助时,我将使用我正在使用的确切代码。我注释的方法

@reflectable

被称为注册。

@reflectable
void registered([_, __]) {
    ....
}

如果我将此方法的名称更改为其他类似的名称

@reflectable
void someOtherName([_, __]) {
    ...
}

没有发生异常。对此感到抱歉,我没有想到该方法的名称可能与它有关。再次抱歉,但我仍然想解释一下为什么带注释的方法的名称在这种情况下很重要。

【问题讨论】:

    标签: dart dart-polymer


    【解决方案1】:

    这很好。

    @reflectable
    void handleSomeEvent([_, __]) {
        ...
    }
    

    您能否在允许重现问题的 GitHub 存储库中提供该项目?

    另一种方法是

    @Listen('someevent')
    void handleSomeEvent([_, __]) {
        ...
    }
    

    (您不需要为此方法向 HTML 添加任何内容)。

    【讨论】:

    • 我在 Github 上还没有项目,可以重现问题。今天晚些时候我会放一个。我也会看看@Listen 注释,但我原来的方法应该有效。
    • 当然,您的原始方法应该有效。我猜异常是由方法内部的代码引发的,而不是由 Polymer 引发的。删除 @reflectable 后的异常是预期的。
    • 啊不,这不是方法内部的代码,因为我删除了除了打印语句之外的所有代码,它仍然抛出异常。我应该澄清一下,这个异常发生在加载时。
    • 我明白了。我将等待可重现的项目。没有所有信息就很难判断。
    • 这里是github.com/terrasea/gcanvas。我仍在更新它以使用 Polymer Dart 1.0.0,在这种情况下相关的两个元素是 gcanvas-app 和 gcanvas-registration。我认为它特定于这个项目,因为我尝试在一个新项目中复制它,它就像一个魅力。那当然是在我降级分析仪版本之后,最新版本让我很头疼,但这是另一个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多