如何订阅可观察字段的更改

时间:2013-10-04 14:40:53

标签: dart dart-polymer

直到最近我可以使用bindProperty,如下所示或在this question中,但是已经改变了0.8.0并且我不知道如何更改我的代码以获得旧的行为(doSomething()被调用):

<polymer-element name="my-login" attributes="model">
  <template>
    <template if="{{"model.isLoggedIn}}">
      ...
    </template>
  </template>
  <script type= ... ></script>
</polymer-element>

@CustomTag("my-login")
class MyLogin extends PolymerElement with ObservableMixin {
  LoginModel model;

  @override
  inserted() {

  void doSomething() {
   ...
  }

logoutChangeSubscription = bindProperty(model,#isLoggedIn,()=&gt; doSomething());

  }
}

class Model extends Object with ObservableMixin {
  @observable bool isLoggedIn = false;
}

3 个答案:

答案 0 :(得分:6)

使用Polymer.dart 0.8或更高版本,您也可以使用以下便利形式:

isLoggedInChanged(oldValue) {
  doSomething();
}

注意如何在PolymerElement中创建一个方法,该方法使用名称​​ yourFieldName *已更改

此处还定义了onPropertyChangehttp://api.dartlang.org/docs/bleeding_edge/observe.html#onPropertyChange

来自文档:

class MyModel extends ObservableBase {
  StreamSubscription _sub;
  MyOtherModel _otherModel;

  MyModel() {
    ...
    _sub = onPropertyChange(_otherModel, const Symbol('value'),
        () => notifyProperty(this, const Symbol('prop'));
  }

  String get prop => _otherModel.value;
  set prop(String value) { _otherModel.value = value; }
}

答案 1 :(得分:5)

Polymer.dart&gt; = 1.0.0

@Property(observer: 'doSomething') bool isLoggedIn;

@reflectable
void doSomething(bool newValue, bool oldValue) => ...

@Observe('isLoggedIn') 
void doSomething(event, detail) => ...

Polymer.dart&lt; 1.0.0

好的,找到了

new PathObserver(model, "isLoggedIn").changes.listen((e) => doSomething());

答案 2 :(得分:1)

似乎语法有所改变。 Günter提出的解决方案的语法现在似乎是:

new PathObserver(model, "isLoggedIn").open((e) => doSomething());