【问题标题】:Observe package from polymer dart观察聚合物飞镖的包装
【发布时间】:2014-06-18 03:47:27
【问题描述】:

我正在尝试使用观察包而不必在我的模型中添加注释,并且只能通过在设置器中提高 notifyPropertyChange 来进行测试,因此我进行了以下测试

import 'package:observe/observe.dart';
import 'dart:async';
import 'dart:math';
void main() {

  var dummyWatchingModel = new DummyWatchingModel();
  new Timer.periodic(new Duration(milliseconds:1000), (_){
           //calls a function that set a random value to the property in the observable model
           dummyWatchingModel.setModelProps();
      });
}

class Model extends Observable{
  int _x;
  Model(this._x);

  int get x=> _x;
  void set x(int value){
    _x = notifyPropertyChange(#_x, _x, value);
  }
}

class DummyWatchingModel{
  Model model = new Model(1); 
  final rng = new Random(); 
  anotherModel(){

    //watch for changes in model instance properties
    this.model.changes.listen((List<ChangeRecord> records) {
      for(ChangeRecord change in records){
        print(change.toString());
      }
    });
  }

  //the callback for the timer to assign a random value model.x
  setModelProps(){
    model.x = rng.nextInt(100);
    print('called...');
  }
}

我正在使用引发 notifyPropertyChange 的 setter 更改 Model 实例中的属性值,但它从不监听更改,知道为什么吗?

【问题讨论】:

    标签: dart dart-polymer


    【解决方案1】:

    我认为您想使用ChangeNotifier 而不是Observable

    我不确定notifyPropertyChange,但对于Observable,您通常需要致电dirtyCheck 以获取有关更改的通知。

    我刚才做了一个小例子来了解这两个是如何工作的:

    import 'package:observe/observe.dart';
    
    class Notifiable extends Object with ChangeNotifier {
      String _input = '';
    
      @reflectable
      get input => _input;
    
      @reflectable
      set input(val) {
        _input = notifyPropertyChange(#input, _input, val + " new");
      }
    
      Notifiable() {
        this.changes.listen((List<ChangeRecord> record) => record.forEach(print));
      }
    }
    
    class MyObservable extends Observable {
      @observable
      String counter = '';
    
      MyObservable() {
        this.changes.listen((List<ChangeRecord> record) => record.forEach(print));
      }
    }
    
    void main() {
      var x = new MyObservable();
      x.counter = "hallo";
      Observable.dirtyCheck();
    
      Notifiable notifiable = new Notifiable();
      notifiable.input = 'xxx';
      notifiable.input = 'yyy';
    }
    

    【讨论】:

    • 让它在不使用@reflectable的情况下工作,但只有在监听模型本身内部的变化时,如果我尝试从 DummyWatchingModel 实例监听模型的变化,它永远不会工作,尝试监听从模型本身外部改变
    • @reflectable 可能仅在构建到 JavaScript 时才需要,因此这些字段不会被 treeshaking 删除。如果我得到它的工作,我会看看。
    • 更新了不同位置的listen语句,DummyWatchingModel中的那个永远不会工作,但是被观察模型的main或ctor内部的那些工作正常
    • 没关系构造函数名称错误现在可以正常工作了哈哈
    猜你喜欢
    • 2013-08-24
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 2014-03-15
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多