2013-06-21 8 views
5

Aktualizowanie tablicy JF Embera nie jest odzwierciedleniem w widokach.Ember JS, aktualizacja tablicy nie odzwierciedla w widokach

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 
    } 
}) 

Szablon

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

To jest kawałek kodu w której jestem pobierania danych z serwera, a po jego załadowaniu, jestem popychając go do tablicy wyników. To ładowanie danych z serwera zajmuje trochę czasu, więc zamień mapy na pustą tablicę wyników. Idealnie, tablica wyników powinna aktualizować rzeczy w szablonie, ale logicznie nie powinna.

Czy jakiekolwiek ciało wie, gdzie mnie brakuje? lub robi źle.

Z góry dziękuję.

Odpowiedz

15

Dla wiązań do pracy należy użyć pushObject zamiast 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 więcej informacji na ember tablicy pushObject proszę zobaczyć here.

Mam nadzieję, że to pomaga.

+0

Właśnie uratowałeś mój dzień. Dziękuje. –

+0

Należy zauważyć, że tablica musi być 'Ember.NativeArray', która jest również' MutableArray'. Jeśli masz rozszerzenie ember natywnego prototypu js Array, to natywna tablica js będzie miała funkcję '.pushObject (thing)'. Jeśli nie rozszerzasz natywnego prototypu, będziesz musiał użyć 'Ember.A ([])'. [Więcej o Ember.A()] (https://emberjs.com/api/ember/3.0/functions/@ember%2Farray/A) –

0

Miałem podobny problem. Problem polega na tym, że Ember nie otrzymuje powiadomienia o zmianie w tablicy. W tym przypadku masz specjalną funkcję Ember (pushObject), która zastępuje standardowe Push, a także powiadamia o strukturze zmiany. Ale w innych przypadkach (na przykład Array.splice) nie masz takiej funkcji, więc musisz ręcznie powiadomić framework. Możesz to zrobić za pomocą:

this.notifyPropertyChange('array');