2013-09-05 10 views
6

Perché il modello non viene aggiornato quando cambio la proprietà che sta visualizzando? Lo documentation afferma che {{each}} è compatibile con le associazioni, ma ovviamente non ne sono a conoscenza.Ember, il mio modello non si aggiorna sulle modifiche delle proprietà

Come tutto in Handlebars, l'helper {{#each}} è associato alle associazioni. Se l'applicazione aggiunge un nuovo elemento all'array, o rimuove un oggetto, il DOM verrà aggiornato senza dover scrivere alcun codice.

Ecco il mio controller

App.MaintemplateController = Ember.Controller.extend({ 
    alist: ['foo', "bar"],   
    actions : { 
    addel: function(){ 
      this.alist.push('xpto'); 
      console.log(this.alist); 
    } 
    } 
}); 

Nel mio modello ho il seguente codice.

{{#each alist}} 
    <li>{{.}}</li> 
{{/each}} 
<button {{action 'addel'}}>Add element</button> 

i dati vengono correttamente resa, e quando si fa clic sul pulsante lo fa aggiungere elementi alla proprietà, ma il modello non viene aggiornata. Perché? Come faccio a tenerlo sincronizzato con i miei dati?

risposta

15

Il modello non viene aggiornato perché si sta utilizzando plain vanilla javascript .push invece della brace dalla condizione .pushObject e .removeObject rispettivamente. Per impostazione predefinita, Ember estende il prototipo dell'array per farlo funzionare bene in un ambiente di rilegatura.

Quindi, per rendere l'aggiornamento del modello si dovrebbe fare:

App.MaintemplateController = Ember.Controller.extend({ 
    alist: ['foo', "bar"],   
    actions : { 
    addel: function(){ 
     this.get('alist').pushObject('xpto'); 
     console.log(this.get('alist')); 
    } 
    } 
}); 

La linea importante qui è this.get('alist').pushObject('xpto'); Inoltre si dovrebbe sempre usare .get() e .set() per accedere agli oggetti nella brace altrimenti il ​​meccanismo vincolante non sarà a conoscenza di modifiche apportate all'oggetto.

Spero che aiuti.

+0

Questo risponde alla mia domanda e risolve questo problema. Tuttavia speravo che esistesse una soluzione che avrebbe funzionato indipendentemente dal tipo di dati. Cosa faccio se al posto di un semplice array ho un oggetto complesso e ho bisogno di utilizzare l'assegnazione per aggiornare alcune delle sue proprietà interne? – Pico

+1

@Pico, felice di poterti aiutare. Bene, nel caso di un oggetto più complesso, scendi l'albero degli oggetti e imposta le sue proprietà, come: 'this.get ('complexObject.childOne.childTwo'). Set ('name', 'foo');' ha senso? – intuitivepixel

+0

Sì, grazie. – Pico

Problemi correlati