2013-03-11 10 views
5

Nie mogę wymyślić, jak użyć klasy adnotacji/obserwowalnej @observable, aby uzyskać proste powiadomienia o zmianie stanu obiektu.Jak korzystać z Google Dart web-ui @observable standalone?

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"; 

Chciałbym użyć obserwable bez reszty web-ui jeśli to możliwe (jako substytut backbone.js).

Odpowiedz

2

Trzeba będzie uruchomić kompilator DWC, która wygląda na @observable i generuje nowy kod źródłowy, który faktycznie implementuje obserwacyjnych. Nigdy nie próbowałem uruchamiać obserwowalnych bez interfejsu WWW, ale na pewno będziesz potrzebować dwc do wygenerowania prawidłowych wyników.

0

Po prostu spędziłem trochę czasu próbując zrobić to samo. Jak stwierdzono w powyższej odpowiedzi, nie można użyć adnotacji @observable bez WebUI/Polymer. Możesz jednak użyć obserwowalnego pakietu. Oto krótki przykład:

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); 
} 

Zdarzenia są asynchroniczne więc należy być ostrożnym, jeśli jesteś polegając na zlecenie tych wydarzeń. Wynikiem powyższego programu jest

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!