2014-02-21 8 views
5

für meine Polymer-Anwendung Ich brauche eine Observable in zwei verschiedenen Geschmacksrichtungen, zum Beispiel als Integer-Wert und String-Wert. Ich verwende Getter und Setter, um den Zustand und die interne Repräsentation einzukapseln. Indem ich dies tue, muss ich notifyPropertyChange für jede beobachtbare in jedem setter implementieren, die zu viel errorprone Klempnerarbeitcode führt. Zum Beispiel Ich brauche zwei Mal notifyPropertyChange -Aussagen für zwei Aromen, wenn ich 4 Aromen verwenden müssen, muss ich verwenden 4 * 4 = 16 notifyPropertyChange -Aussagen. Ich habe den Klick-Gegenbeispiel modifiziert dies zu verdeutlichen:Dart: Observable mit mehreren Getter/Setter

@CustomTag('click-counter') 
class ClickCounter extends PolymerElement { 
    int _count; 
    @observable int get count => _count; 
    @observable set count(int val) { 
    notifyPropertyChange(#count,_count,val); 
    _count = notifyPropertyChange(#strcount,_count,val);} 

    @observable String get strcount { 
    print("TOSTRING "+_count.toString()); 
    return _count.toString();} 

    @observable set strcount(String val) { 
    notifyPropertyChange(#strcount,_count,int.parse(val)); 
    _count = notifyPropertyChange(#count,_count,int.parse(val));} 

    ClickCounter.created() : super.created() { 
    } 

    void increment() { 
    count++; 
    } 
} 

Gibt es einen besseren Weg, dies -Aussagen ohne so viel notifyPropertyChange zu implementieren?

Grüße

Markus

Antwort

1

ich es nicht getestet, aber es sollte funktionieren, und ich denke, seinen bemerkenswerten weniger Code, wenn Sie mehr solche Eigenschaften haben.

@CustomTag('click-counter') 
class ClickCounter extends PolymerElement { 
    int _count; 
    @observable int get count => _count; 
    set count(int val) { 
    notifyPropertyChange(#count,_count,val); 
    notifyPropertyChange(#strcount, _count.toString(), val.toString()); 
    _count = val; 

    @observable String get strcount { 
    // print("TOSTRING "+_count.toString()); 
    return _count.toString();} 

    set strcount(String val) { 
    count = int.parse(val); // set the new value using the setter not the field to fire property change 
    } 

    ClickCounter.created() : super.created(); 

    void increment() { 
    count++; 
    } 
} 
+0

Ihnen sehr danken. Das funktioniert! Also habe ich nur eine notifyPropertyChange pro beobachtbares Symbol. – user3338276

1

Falls die count Eigenschaft muss nicht privat sein - etwas, nach den Dart style guide betrachten - eine süße Wahl für diese Art von Situation zur Verfügung stehen würde.

class ClickCounter extends PolymerElement { 
    @observable int count; 
    ... 
    void countChanged(oldValue) { 
     // do something... 
    } 
} 

Änderungen aufgetreten zu beobachtbaren Eigenschaften automatisch auf Verfahren wie <property_name>Changed genannt weitergegeben wird, wo property_name auf die Eigenschaft bezieht sich auf auszuspionieren.

Hoffe, diese Hilfe bringt mehr Spaß beim Schreiben von Polymer-Komponenten.

1

Nicht sicher, ob dies für Sie gilt, aber ich hatte das gleiche Problem. In meinem Fall konnte ich es jedoch nur mit der einen Eigenschaft und einem Filter lösen.

dart Klasse

int count; 

int asInt(...) // can't remember details of filters 

html

<input type="text">{{count | asInt}}<input> 

Apologies für die Unrichtigkeit des Codes. Ich bin auf meinem Telefon und habe keine Zeit, den Code zu durchsuchen. Hoffentlich bekommen Sie die Idee

Prost Anders