Ember berechnete Eigenschaft nicht aktualisiert
Bin ich mir auch nicht ganz sicher, warum meine berechnete Eigenschaft ist nicht die Rückkehr aktualisierten Werte.
Habe ich eine Liste von Optionen, die ein Benutzer kann durch klicken, und die Aktion updates eine Eigenschaft, die ein Glut-Objekt für die controller. Ich habe eine berechnete Eigenschaft, die loops durch das Objekt sieht für Schlüssel, die nicht-null-Werte für das Ember-Objekt-Eigenschaft, und wenn es nicht gefunden wird, gibt Sie false zurück, ansonsten true.
Hier sind die Sachen:
App.SimpleSearch = Ember.Object.extend({
init: function() {
this._super();
this.selectedOptions = Ember.Object.create({
"Application" : null,
"Installation" : null,
"Certification" : null,
"Recessed Mount" : null,
"Width" : null,
"Height" : null,
"Heating" : null,
"Power" : null
});
},
selectedOptions: {},
numOfOptions: 0,
allOptionsSelected: function() {
var selectedOptions = this.get('selectedOptions');
for (var option in selectedOptions) {
console.log(selectedOptions.hasOwnProperty(option));
console.log(selectedOptions[option] === null);
if (selectedOptions.hasOwnProperty(option)
&& selectedOptions[option] === null) return false;
}
return true;
}.property('selectedOptions')
});
App.SimpleSearchRoute = Ember.Route.extend({
model: function() {
return App.SimpleSearch.create({
'SimpleSearchOptions': App.SimpleSearchOptions,
'numOfOptions': App.SimpleSearchOptions.length
});
},
setupController: function(controller, model) {
controller.set('model', model);
}
});
App.SimpleSearchController = Ember.ObjectController.extend({
getProductsResult: function() {
var productsFromQuery;
return productsFromQuery;
},
setSelection: function (option, selectionValue) {
this.get('selectedOptions').set(option, selectionValue);
this.notifyPropertyChange('allOptionsSelected');
},
actions: {
registerSelection: function(option) {
console.log('registering selection');
console.log(this.get('allOptionsSelected'));
console.log(this.get('selectedOptions'));
this.setSelection(option.qname, option.value);
},
Die action im controller registerSelection
ist er nur gut, aber ich sehe nur die console.log
von der SimpleSearch
Modell einmal. Sobald die Eigenschaft berechnet wird, die erste Zeit, es ist nicht die Aufmerksamkeit, nach, dass, was bedeutet, dass die berechnete Eigenschaft ist nicht die Veränderungen zu beobachten, zu selectedOptions
immer wenn diese aufgerufen wird:
setSelection: function (option, selectionValue) {
this.get('selectedOptions').set(option, selectionValue);
this.notifyPropertyChange('allOptionsSelected');
},
Edit:
Ich tatsächlich mein Problem gelöst, ohne etwas zu ändern.
Ich geändert habe die folgende Zeile:
this.notifyPropertyChange('allOptionsSelected');
:
this.get('model').notifyPropertyChange('selectedOptions');
notifyPropertyChange
muss aufgerufen werden, im Kontext des Modells (oder der Glut-Objekt, Beobachter von einer bestimmten Eigenschaft), und der string wird als argument ist der name der Eigenschaft, wurde aktualisiert.
Nachdem ich diese änderung vorgenommen, es funktionierte wie vorgesehen.
InformationsquelleAutor Nathan Lutterman | 2014-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ember nicht die Beobachtung von Objekten für jede änderung an einem Objekt beobachtet, eine einzelne Eigenschaft.
Wie diese auf Sie? Auch bei dieser Methode, die Sie beobachten
selectedOptions
, sondern das Objekt selbst ist immer noch das gleiche Objekt, Sie verändert werden könnte-Eigenschaften, aber nicht das Objekt selbst. Und dann sagen Sie Glut in den Anwendungsbereich der controller, derallOptionsSelected
geändert hat, so ist es regrabs es ist, aber es nicht neu berechnen, denn es ist nicht schmutzig, es gerade geändert. Würden Sie wirklich wollen, zu sagenselectedOptions
hat sich geändert zu bekommenallOptionsSelected
berechnen Sie seinen Wert. Leider tun Sie dies in der Reichweite der Steuerung, also den dem Steuergerät mitgeteilt wird, dass die Eigenschaft geändert wurde, spielt dabei keine Rolle.Hier ein dummy-Beispiel zeigt, welche Dinge verursachen es, um tatsächlich zu aktualisieren.
http://emberjs.jsbin.com/iCoRUqoB/1/edit
Ehrlich da bist du nicht gerade Besondere Eigenschaften würde ich wahrscheinlich ein array, oder erstellen Sie eine Methode auf das Objekt, das verarbeitet das hinzufügen/entfernen/ändern Sie die Eigenschaften so konnte man das Feuer von innen Anwendungsbereich einer Eigenschaft ändern, aktualisieren alle Eltern die Zuhörer mit den änderungen.
.propert('selectedOptions') to
.Eigenschaft('selectedOptions.Anwendung', 'selectedOptions.Installation', 'selectedOptions.Zertifizierung'...` und dann war es gerade die einzelnen sub-Eigenschaften. Die Optionen basieren aus einer JSON zurückgegeben wird, also ich denke du hast Recht mit nur einem array. Ich werde die Länge oder die Anzahl von Optionen sowieso, also werde ich nur eine Bedingung zu überprüfen.InformationsquelleAutor Kingpin2k
Ember berechnete Eigenschaft abhängig-Tasten kann ein
'salesAccount.name und salesAccount.website'
Beispiel extrahiert aus Ember.Modell definition:
InformationsquelleAutor Ganesh Arulanantham