再一次,与 Dart/Polymer 相关的问题。
我想使用 Parse.com JavaScript 库,但由于它在 Dart 中不可用,我编写了 Wrapper 类,它存储一个 JsObject 并将所有来自 Dart 的调用委托(delegate)给相应的 JavaScript 对象。基本上它就像一个代理。
你猜怎么着,它工作得很好。
但是,我的观察结果没有。要理解这一点,您必须查看我的“代理”类之一的以下结构。
class ParseObject extends Observable {
JsObject _jsDelegate = new JsObject(context['Parse']['ParseObject']);
void set(String key, dynamic value) {
_jsDelegate.callMethod('set', [key, jsify(value)];
}
dynamic get(String key) {
return dartify(_jsDelegate.callMethod('get', [key]));
}
}
我的 Polymer Element 的 HTML 代码如下所示:
<div>Name: {{project.get('name')}}</div>
由于数据绑定(bind)仅在方法参数更改的情况下进行评估,因此它永远不会更新,因此即使名称更改,旧的名称仍将保留。
我想出的解决方案是将用户在 ParseObject#set(String, dynamic) 方法中设置的所有值存储到一个可观察的 Map 中。这可行,但我认为它很脏,因为我必须确保两个 Maps,Dart 中的一个和 ParseObject 的 JavaScript 表示中的一个相等。
因此,我正在寻找一个更好的解决方案,并且我想到了某种方法来告诉 Polymer 重新评估它的数据绑定(bind)。
是否存在这种方法或是否有任何其他可能性来解决这个问题?
最佳答案
扩展 observable 本身什么也不做。
您需要使用 @observable
注释 setter/getter (如果你没有使用 Polymer,你还需要将 observable 转换器添加到 pubspec.yaml)。您不能使函数可观察(这适用于 Polymer 元素,但不适用于 Observable
模型类。有关可观察的更多详细信息,请参见例如 Implement an Observer pattern in Dart 或 Dart: @observable of getters
关于dart - 在 Dart 中以编程方式通知 Observable-Watchers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29703042/