2013-10-04 24 views
6

直到最近我可以使用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(模型,#isLoggedIn,()=> doSomething的());

} 
} 

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

回答

6

随着Polymer.dart 0.8或更高版本,你也可以使用这种便利的形式:

isLoggedInChanged(oldValue) { 
    doSomething(); 
} 

注意如何创建你的PolymerElement内的方法,它使用的名称yourFieldName *更改

还有onPropertyChange这里定义:http://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; } 
} 
5

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()); 
1

看来,语法已经改变了一点点。 现在君特提出的解决方案的语法似乎是:

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