2015-12-17 4 views
5

Ich versuche, eine deprecation zu beseitigen, die ich kürzlich in meinen Code eingeführt, und ich brauche Hilfe.Ember Ember-views.render-Doppel ändern deprecation

Die deprecation ist:

Sie geändert ... zweimal in einem einzigen machen. Dies war unzuverlässig in Ember 1.x und wird in Ember 2.0 entfernt werden [deprecation ID: glut-views.render-double-Modify]

Was ich versuche, eine Liste von Partituren zu tun ist, anzuzeigen, und dann die Summe der Punkte. Ich muss die niedrigste Punktzahl fallen lassen und sie nicht in die berechnete Summe einbeziehen. Ich habe das funktioniert. Die Vernachlässigung tritt auf, wenn ich versuche, eine CSS-Klasse über die classNameBindings zu dem Ergebnis hinzuzufügen, das ausgeschlossen wurde.

Ich bin mir ziemlich sicher, dass dies geschieht, wenn ich die Ember.set während meiner berechneten Eigenschaft calculatedTotal tue.

Meine Frage ist, wie kann ich sonst noch die Gesamtpunktzahl zu halten mit dem CSS aktualisierte auch aktualisiert, wenn ich eine Partitur in Form ändern?

Code-Details: Ich habe zwei Komponenten; Score-Reihe und Richter-Reihe. Score-row nimmt eine Reihe von Partiturobjekten auf, durchläuft jede Partitur und ruft die richter-Score-Komponente auf. (Verspottet Code für diese Frage herausgezogen)

let scores = new Ember A(); 
scores.pushObject(Ember.Object.create({ points: 1 })); 
scores.pushObject(Ember.Object.create({ points: 2 })); 
scores.pushObject(Ember.Object.create({ points: 3 })); 

-

https://ember-twiddle.com/6696d907b604aa750201?numColumns=1

index.js:

Ember  : 2.2.0 
Ember Data : 2.2.1 

aktualisieren ist hier ein Arbeits Ember Twiddle das Problem demonstriert index.hbs

{{score-row scores=scores}} 

Score-row.hbs

{{#each scores as |score|}} 
    {{judge-score score=score}} 
{{/each}} 

{{calculatedTotal}} 

Score-row.js:

calculatedTotal: Ember.computed('[email protected]',() => { 
    let totalScore = 0, 
     scores = this.get('scores'); 

    if(Ember.isPresent(scores)) { 
     var i, 
      scoresLength = scores.length, 
      sortedAscending, 
      numLowToDrop = 1; 

     sortedAscending = this.get('sortedScores'); 

     for(i = 0; i < scoresLength; i++) { 
      currentScoreObj = sortedAscending.objectAt(i); 

      // I think this is what is causing the ember-views.render-double-modify 
      Ember.set(currentScoreObj, '_droppedLow', (i < numLowToDrop)); 
     } 

     sortedAscending.forEach((score) => { 
      if(!score.get('_droppedLow')) { 
       totalScore += +score.get('points'); 
      } 
     }); 
    } 
    return totalScore; 
}), 

// had to write my own sort because scores.sortBy('points') was sorting as if 
// points were a string and not a number ? 
sortedScores: Ember.computed.sort('[email protected]', (score1, score2) => { 
    if (+score1.get('points') > +score2.get('points')) { 
     return 1; 
    } else if (+score1.get('points') < +score2.get('points')) { 
     return -1; 
    } 
    return 0; 
}) 

Richter-score.hbs

{{input value=score.points}} 

Richter-score.js

import Ember from 'ember'; 

export default Ember.Component.extend({ 
    classNameBindings: [ 
     "score._droppedLow:droppedLow" 
    ] 
}); 

Danke!

+0

Haben Sie jemals diese sortiert werden? Ich sehe es in genau den gleichen Umständen. –

+1

Ja Chris, wenn Sie sich die Embtwiddle-Seite anschauen, hat sie nicht mehr die Verwarnungs-Warnung.Im Grunde verwendete ich eine andere berechnete Eigenschaft, um die Punkte anzuzeigen. – DanMonroe

Antwort

0

Ich frage mich, ob vielleicht jedes Mal pushObject aufgerufen wird es wieder löst Ihre berechnete Eigenschaft?

Versuchen Sie folgendes:

let scores = new Ember A([ 
    Ember.Object.create({ points: 1 }), 
    Ember.Object.create({ points: 1 }) 
]); 
+0

Danke Pedro. Ich habe einen Ember Twiddle mit deinem Vorschlag hinzugefügt, aber er hat immer noch die Verwarnungswarnung. – DanMonroe