Как подписаться на изменение наблюдаемого поля
До недавнего времени я мог использовать 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());