2015-06-16 13 views
5

Umzug von Polymerv0.5 zu v1.0 der Registrierungsprozess von Polymer elements scheint anders zu sein. Vor Polymer v1.0 konnten wir JavaScript-Code von index.html ausführen, um alle benötigten Objekte in unserem Polymer elements zu initialisieren. Dies ist ein sehr wichtiges Detail, da die data-binding in PolymerONLY korrekt funktioniert, wenn die gebundenen Objekte initialisiert werden FIRST. Das bedeutet folgendes:JavaScript Initialisierung vor Polymer Elemente Registrierung

Zum Beispiel, wenn Sie ein Objekt in Ihrem Polymer element mit {{ }} oder [[ ]] binden möchten, das Objekt muss vor der Polymer element Registrierung definiert werden! Siehe:

<dom-module id="my-elem"> 
    <template> 
    <div>This should be my bounded object: <b>{{obj.name}}</b></div> 
    </template> 
    <script> 
    Polymer({ 
    is: 'my-elem', 
    ready: function() { 
     // Global initialized object!!! 
     // app.obj ==> app.obj = { name: 'Great', info: 'Additional info!!!' }; 
     this.obj = app.obj; 
    } 
    ...  
    </script> 
</dom-module> 

Das Problem, das ist, wenn die Polymer elementVOR registriert ist app.obj initialisiert (im Beispiel oben this.obj ist undefined zum Zeitpunkt der Polymer element Registrierung) dann NO Benachrichtigung ausgeführt wird und kein Update zur Verfügung gestellt, auch wenn app.obj ist NICHTundefined später.

Also in Fällen wie diesem müssen wir zuerst alle gebundenen Objekte initialisieren, bevor wir sie mit {{ }} oder [[ ]] verwenden können.

Ist unser Ansatz völlig falsch ??? Irgendwelche Vorschläge???

+0

Ich bin mit einem sehr ähnlichen Problem im Moment zu kämpfen. Haben Sie einen akzeptablen Weg gefunden, dies zu handhaben? – Christof

Antwort

0

Ich hatte ähnlichen Fall, aber arbeitete ohne sich über Async zu sorgen. Definieren Sie einfach die Eigenschaft explizit sollte funktionieren.

properties: { 
    obj: { 
    type: Object, 
    value: {} 
    } 
} 

Wenn das nicht funktioniert, versuchen Sie observer spezifizieren und eine Funktion definieren, die obj richtig behandelt.

properties: { 
    obj: { 
    type: Object, 
    value: {}, 
    observer: 'loaded' 
    } 
} 
+0

Diese beiden Vorschläge funktionierten nicht für mich. Entsprechend der Dokumentation zu [Datenbindung] (https://www.polymer-project.org/1.0/docs/devguide/data-binding.html#set-path) muss ich eine der Hilfsfunktionen 'notifyPath (path, value) 'oder' set (path, value) 'um das System zu informieren, dass' obj' sich geändert hat. In meinem Fall muss ich es innerhalb von JavaScript machen, wo mein asynchroner 'Firebase' Funktionsaufruf das Objekt aufruft. – DoK

+0

Es sieht also so aus, als ob Änderungen an allen Untereigenschaften, die als gebundenes Attribut zugewiesen sind, eine solche Implementierung erfordern. In der Tat ist dies das Dokument von dem, was Sie beschrieben https://www.polymer-project.org/1.0/docs/devguide/data-binding.html#path-binding. Vielen Dank für die Aktualisierung. – agektmr

0

Als Abhilfe können statt this.obj = app.obj; in einer ready Funktion, würde ich einen Ereignis-Listener hinzufügen, die gefeuert zu einem Ereignis hören würde, wenn app.obj lädt und dann die Bindung setzt:

ready: function() { 
    var that = this; 
    this.addEventListener('app-obj-loaded', function() {that.obj=app.obj}); 
} 
+0

Wie kann ich ein 'app-obj-loaded' Ereignis aus JavaScript auslösen oder senden? – DoK

+0

Es gibt verschiedene Möglichkeiten, ein benutzerdefiniertes Ereignis auszulösen, aber ich würde [Polymer.Base.fire] (https://www.polymer-project.org/1.0/docs/devguide/Dienstprogramm-Funktionen.html # Dienstprogramm-Funktionen). –

+0

Die Verwendung von [Polymer.Base.fire] (https://www.polymer-project.org/1.0/docs/devguide/utility-functions.html#utility-functions) ist nur innerhalb des Polymerkontexts möglich. In meinem Fall erhalte ich das Objekt von 'Firebase', das asynchron kommt und im JavaScript-Kontext vorkommt. IMO macht es keinen Sinn, UI-Komponenten mit der Datenschicht zu vermischen. Also muss ich andersherum meine Polymer-UI-Komponenten über Änderungen informieren, die in JavaScript auftreten. – DoK

Verwandte Themen