2013-06-21 4 views
5

Aggiornamento L'array JS di Ember non riflette nelle viste.Ember JS, aggiornamento dell'array non riflettente nelle viste

controller

App.MyController = Ember.ArrayController.extend({ 
    results: [], 
    init: function(){ 
    _this = this 
    App.MyModel.find({}).then(function(contents) { 
     obj1 = contents.objectAt(0) 
     obj1.get('data').hasMany.results.forEach(function(item){ 
      _this.results.push(item) 
     }); 
    }) 
    //rest of the code 
    } 
}) 

Template

{{#each results}} 
    // show items of reults. 
{{/each}} 

Questo è il pezzo di codice in cui sono il recupero dei dati dal server e sul suo carico, sto spingendo in risultati array. Questo caricamento dei dati dal server richiede un po 'di tempo, quindi i template si sovrappongono all'array dei risultati vuoto. Idealmente, la matrice dei risultati dovrebbe aggiornare le cose nel modello ma logicamente non dovrebbe.

Qualcuno sa dove mi manca? o sbagliato.

Grazie in anticipo.

risposta

15

Per il binding, è necessario utilizzare pushObject anziché push.

App.MyController = Ember.ArrayController.extend({ 
    results: [], 
    init: function(){ 
    _this = this; 
    App.MyModel.find({}).then(function(contents) { 
     obj1 = contents.objectAt(0); 
     obj1.get('data').hasMany.results.forEach(function(item){ 
     _this.results.pushObject(item) 
     }); 
    }) 
    //rest of the code 
    } 
}); 

Fore più informazioni serie brace pushObject vedere here.

Spero che aiuti.

+0

Hai appena salvato la mia giornata. Grazie amico. –

+0

Si noti che l'array deve essere un 'Ember.NativeArray', che è anche un' MutableArray'. Se hai ember estendi il prototipo nativo di array js, allora l'array js nativo avrà una funzione '.pushObject (cosa)'. Se non stai estendendo il prototipo nativo dovrai usare 'Ember.A ([])'. [Maggiori informazioni su Ember.A()] (https://emberjs.com/api/ember/3.0/functions/@ember%2Farray/A) –

0

Ho avuto un problema simile. Il problema è che Ember non viene avvisato della modifica dell'array. In questo caso hai una funzione Ember speciale (pushObject) che sostituisce lo standard Push e notifica anche il framework del cambiamento. Ma in altri casi (ad esempio Array.splice) non si dispone di tale funzione, quindi è necessario notificare manualmente il framework. Puoi farlo con:

this.notifyPropertyChange('array');