Как подписаться на изменение наблюдаемого поля

До недавнего времени я мог использовать bindProperty, как показано ниже или в этом вопросе, но это изменилось с 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, () => doSomething());

  }
}

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

3 ответа

Решение

С Polymer.dart 0.8 или выше вы также можете использовать эту удобную форму:

isLoggedInChanged(oldValue) {
  doSomething();
}

Обратите внимание, как вы можете создать метод внутри вашего PolymerElement, который использует имя yourFieldName* Изменено

Есть также onPropertyChange как определено здесь: http://api.dartlang.org/docs/bleeding_edge/observe.html

Из документов:

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; }
}

Polymer.dart >= 1.0.0

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

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

или же

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

Polymer.dart < 1.0.0

Хорошо нашел

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

Кажется, что синтаксис немного изменился. Синтаксис решения, предложенного Гюнтером, теперь выглядит так:

new PathObserver(model, "isLoggedIn").open((e) => doSomething());
Другие вопросы по тегам