2013-08-30 3 views

ответ

2

Пакет observe включает в себя обертку для отдельных наблюдаемых значений: ObservableBox.

import 'package:observe/observe.dart'; 
import 'dart:async'; 

void main() { 
    ObservableBox myValue = new ObservableBox('hello'); 

    myValue.changes.listen((List<ChangeRecord> records) { 
    PropertyChangeRecord record = records[0] as PropertyChangeRecord; 

    print('${record.field} changed, it is now ${myValue.value}'); 
    }); 

    new Timer.periodic(const Duration(seconds: 1), (t) { 
    myValue.value = new DateTime.now(); 
    }); 
} 

Там нет никакого способа наблюдать верхнего уровня или функции-Scope одну строку, логическое значение, INT, или дважды без использования ObservableBox.

Если строка, boolean, int или double является полем класса, вы можете использовать ObservableMixin и аннотацию @observable.

class Foo extends Object with ObservableMixin { 
    @observable String bar = ''; 
} 

Затем вы можете получить уведомление о том, когда экземпляр Foo меняется:

foo.changes.listen((List<ChangeRecord> records) { 
    // ... 
}); 
+0

Оказывается, что в настоящее время (SDK 1.6) это имя, а не поле, а OldValue и новое_значение. Однако имя является символом, поэтому record.name == «myProperty» не будет оцениваться. Хмм. –

+0

Итак, record.name == «myProperty» необходимо преобразовать в String с использованием зеркал. См. Мой ответ и код ниже. –

2

Ниже приведен пример связывания значения строки, которая является атрибутом объекта: (. Этот ответ относится к Polymer.dart)

<!DOCTYPE html> 

<html> 
    <head> 
    <title>index</title> 
    <script src="packages/polymer/boot.js"></script> 
    </head> 

    <body> 
    <template id="_template" bind> 
     <input type="text" value="{{name}}"> 
     <p>The name is {{name}}</p> 
    </template> 

    <script type="application/dart" src="index.dart"></script> 
    </body> 
</html> 
import 'dart:html'; 
import 'package:polymer/polymer.dart'; 

class Person extends Object with ObservableMixin { 
    @observable 
    String name; 
    Person(this.name); 
} 

main() { 
    query("#_template").model = new Person('Bob'); 
}