2016-06-24 5 views
0

Ich habe dieses seltsame Problem beim Zurückgeben eines Arrays aus einer berechneten Eigenschaft. Ich habe das Problem genau kennengelernt (wie unten), bin mir aber nicht sicher über die Lösung. Habe zu Demonstrationszwecken ein Twiddle erstellt um es zu erklären.Ember js - Wert zurückgegeben von der berechneten Eigenschaft sieht zwischengespeichert

Fall 1: https://ember-twiddle.com/9910dfea25b6fc4791e3920acca2558d?openFiles=controllers.application.js%2C

Schritte:

a) überprüfen Sie das erste Kontrollkästchen, und wenn wir den Wert von "arr" in der Konsole, die "NEWPROP" Eigenschaft sehen wird jedes Objekt hinzugefügt werden in "arr"

b) Un die gleiche Checkbox überprüfen, siehe die Konsole, das gleiche "arr" wird mit dem "newprop" immer noch dort zurückgegeben. Aber ich nahm an, es wäre nicht dort gewesen, da es eine Kontrolle dafür gibt, wenn Bedingung.

Also, nach ein wenig Fehlersuche, kam ich mit diesem identischen nächsten Twiddle.

Fall 2: https://ember-twiddle.com/735750b0a41c4bf87841bc79c6163259?openFiles=controllers.application.js%2C

führen die gleichen Schritte und wir sehen, dass dieses Mal die „arr“ nicht über „NEWPROP“, wenn das Kontrollkästchen

Der einzige Unterschied zwischen twiddle nicht markiert ist ist, dass das Array (mit Daten/Modell) in der ersten in "getData" selbst definiert ist und in der zweiten, es aus einer anderen berechneten Eigenschaft "was".

Was ich suche: Ich muss Case 1 Twiddle arbeiten, aber wenn das Kontrollkästchen deaktiviert ist, sollte die "arr" das eigentliche Original "arr" ohne den "newprop" zurückgeben. Auch müssen Sie verstehen, warum es passiert. Das einzige, was geändert wird, ist, dass die Daten direkt in fn oder über eine andere berechnete Eigenschaft abgerufen werden.

Antwort

1

Dies ist der Hauptzweck der berechneten Eigenschaften. Sie ändern sich, wenn sie abhängige Schlüssel ändern. In Fall 2 definieren Sie Ihr Array immer neu. In Fall 1 greifen Sie bei jedem Aufruf auf das gleiche Array zu.

In Fall 1 können Sie einen abhängigen Schlüssel auf Ihrer Eigenschaftsliste hinzufügen.

what: function(){ 
    var arr = [ 
     { 
     a:"b", 
     c: [ 
      {key:"1"},{key:"2"} 
     ] 
     }, 
     { 
     a:"f", 
     c: [ 
      {key:"1"},{key:"1"} 
     ] 
     } 
    ]; 
    return arr; 
    }.property('filterSet'), // see here 

Dies wird Array regenerieren, wenn die Eigenschaft filterSet Änderungen.

EDIT:

proof

+0

Aber ich habe schon "FILTERSET" als abhängige in "getData" Eigenschaft, ist das nicht richtig. Dies stellt sicher, dass getData jedes Mal aufgerufen wird, wenn sich filterSet ändert. Und wenn das richtig ist, holt getData immer die Was-Eigenschaft als this.get (was), die immer die Originaldaten holen soll. Bitte korrigieren Sie mich, wenn Sie falsch sind – whyAto8

+0

haben Sie dies in der Twiddle? weil es nicht das Problem in Fall 1 in der Twiedle ändert. – Craicerjack

+1

@Craicerjack ja Ich habe den Code in der Twiddle geändert, und es zeigte mir das gewünschte Ergebnis in der Konsole. – Timm