[Dart] PolymerでObservableにsetterを使う
observableのプロパティに、setterを使いたいときってあるよね。
こんな感じ。
で、html側で{{title}}ってやるわけですが。
でも、これ動きません!
titleの実体がfunctionだからだと思いますが、変更イベントが飛ばないのです。
というわけで、自分で変更イベントを飛ばせばOKとのこと。
具体的には、setterを下記のように変更します。
set title( String t ) {
_title = notifyPropertyChange( #title, _title, t );
}
notifyPropertyChangeの仕様は下記の通り。
dynamic notifyPropertyChange(Symbol field, Object oldValue, Object newValue)
戻り値はnewValueとなっています。
そして、これをするとgetterの@observableが不要になります。つまり、observableに頼らず、自前で変更イベントを出せるってことですね。
…っていうか、#titleって何ヨ?
本来、const Symbol("title")としなければいけないっぽいが、表記を省略できるってことかね?
https://groups.google.com/a/dartlang.org/forum/#!topic/web-ui/hxCqmwjnLIA
まさにこれのサンプル
https://github.com/sethladd/dart-polymer-dart-examples/tree/master/web/setter_with_observable_property_change
こんな感じ。
String _title = "";
@observable String get title => _title;
set title( String t ) => _title = "hoge $t";
で、html側で{{title}}ってやるわけですが。
でも、これ動きません!
titleの実体がfunctionだからだと思いますが、変更イベントが飛ばないのです。
というわけで、自分で変更イベントを飛ばせばOKとのこと。
具体的には、setterを下記のように変更します。
set title( String t ) {
_title = notifyPropertyChange( #title, _title, t );
}
notifyPropertyChangeの仕様は下記の通り。
dynamic notifyPropertyChange(Symbol field, Object oldValue, Object newValue)
戻り値はnewValueとなっています。
そして、これをするとgetterの@observableが不要になります。つまり、observableに頼らず、自前で変更イベントを出せるってことですね。
…っていうか、#titleって何ヨ?
本来、const Symbol("title")としなければいけないっぽいが、表記を省略できるってことかね?
参考資料:
同様の質問https://groups.google.com/a/dartlang.org/forum/#!topic/web-ui/hxCqmwjnLIA
まさにこれのサンプル
https://github.com/sethladd/dart-polymer-dart-examples/tree/master/web/setter_with_observable_property_change
コメント
コメントを投稿