5

@observable アノテーション/Observable クラスを使用して、オブジェクトの状態が変化したときに簡単な通知を受け取る方法がわかりません。

import 'package:web_ui/observe.dart';

@observable class T{
  String x;
// what else is needed?
}

T t = new T();
observe(t, (e) => print ("Value changed"));
t.x = "Changed";

可能であれば、残りの web-ui なしでオブザーバブルを使用したいと思います (backbone.js の代わりとして)。

4

2 に答える 2

2

dwc コンパイラを実行する必要があります。これは @observable を探し、実際に監視を実装する新しいソース コードを生成します。Web UI なしでオブザーバブルを実行しようとしたことはありませんが、正しい出力を生成するには dwc が必要です。

于 2013-03-12T05:55:31.270 に答える
0

私はちょうど同じことをしようとして時間を費やしました. 上記の回答で述べたように、@observableWebUI/Polymer なしではアノテーションを使用できません。ただし、観察可能なパッケージを使用できます。簡単な例を次に示します。

import 'package:observe/observe.dart';

void main() {
  var person = new Person(18, false);

  person.changes.listen((List<ChangeRecord> changes) {
    changes.forEach((PropertyChangeRecord change) {
      print("$change");
    });
  });

  person.changes.listen((List<ChangeRecord> changes) {
    changes.where((PropertyChangeRecord c) => c.name == #employed).forEach((PropertyChangeRecord change) {
      print("Employment status changed!");
    });
  });

  print("start changing");

  person.age =  19;
  person.age =  19;
  person.age =  19;
  person.age = 20;
  person.employed = true;
  person.age = 21;
  person.age = 22;

  print("finish changing");
}

class Person extends ChangeNotifier {

  int _age;
  int get age => _age;
  void set age (int val) {
    _age = notifyPropertyChange(#age, _age, val);
  }

  bool _employed;
  bool get employed => _employed;
  void set employed (bool val) {
    _employed = notifyPropertyChange(#employed, _employed, val);
  }

  Person(this._age, this._employed);
}

イベントは非同期であるため、これらのイベントの順序に依存している場合は注意してください。上記のプログラムの出力は、

start changing
finish changing
#<PropertyChangeRecord Symbol("age") from: 18 to: 19>
#<PropertyChangeRecord Symbol("age") from: 19 to: 20>
#<PropertyChangeRecord Symbol("employed") from: false to: true>
#<PropertyChangeRecord Symbol("age") from: 20 to: 21>
#<PropertyChangeRecord Symbol("age") from: 21 to: 22>
Employment status changed!
于 2014-01-05T15:24:06.367 に答える