2012-02-06 18 views
7

Sto appena iniziando a giocare con la libreria ember.js per vedere di cosa si tratta. Voglio visualizzare una tabella di dati e, a destra di ogni riga, avere un pulsante di cancellazione per eliminare quell'elemento dalla tabella. Non ho idea di come farlo però.azioni specifiche dell'oggetto nelle viste collezione ember.js

Nota, ho anche provato a creare una vista figlio (ItemView) e usarlo in linea all'interno della sezione {{#each ...}} ... {{/ each}}, ma ember.js si lamenta di aspettarsi una classe vista invece di ItemView, anche se ItemView è definito utilizzando Ember.View.create. Vorrei anche sapere perché non funziona. Anche il codice di esempio per l'utilizzo di una vista secondaria in un blocco #each nella documentazione non funziona.

Anche se potessi dichiarare una vista secondaria denominata ItemView per il rendering di ogni singolo elemento, non saprei ancora come ottenere l'azione removeItem di quella determinata vista per sapere quale elemento rimuovere dalla raccolta itemsController. Esiste una proprietà della vista per recuperare l'istanza Item a cui è associata la vista figlio in una raccolta?

Ecco la parte del mio modello di vista che ha l'elenco:

{{#each App.itemsController}} 
      <tr> 
       <td>{{itemName}}</td> 
       <td><a href="#" {{action "removeItem" on="click"}}>Delete</a></td> 
      </tr> 
{{/each}} 

Ed ecco il mio javascript:

window.App = Ember.Application.create(); 

window.App.Item = Ember.Object.extend({ 
    itemName: "defaultItemName" 
}); 

window.App.itemsController = Ember.ArrayProxy.create({ 
    content: [] 
}); 

window.App.ListView = Ember.View.create({ 
    templateName: 'listView', 

    removeItem: function (event) { 
     // ??? How do I figure out what item 
     // the user wanted to remove? 
    } 
}); 

risposta

11

Il post di Yehuda, Michael, collegato per dimostrare l'approccio corretto, utilizzando un elemento Vista figlio all'interno di ciascuno. Non sono sicuro del motivo per cui non ha funzionato per te, hai rimosso quel pezzetto di codice dalla tua domanda sfortunatamente.

Alcune delle sintassi nella risposta di Yehuda sono leggermente obsolete, quindi l'ho aggiornata e modificata per essere un po 'più simile alla tua domanda. Puoi verificarlo qui: http://jsfiddle.net/wmarbut/67GQb/130/ (collegamento aggiornato alla jsfiddle 1/21/12)

La spinta di esso è

Manubrio

{{#each App.peopleController}} 
    {{#view App.PersonView personBinding="this"}} 
     <td>{{view.person.fullName}}</td> 
     <td><button {{action removeItem target="view"}}>Delete</button> 
    {{/view}} 
{{/each}} 

Javascript

App.PersonView = Ember.View.extend({ 
    tagName: 'tr', 
    person: null, 
    removeItem: function() { 
     var person = this.get('person'); 
     App.peopleController.removeObject(person); 
    } 
}); 
+0

OK, quando provo questo metodo, il motore di template sembra ignorare qualsiasi o tag ho messo nel modello di vista all'interno della {{#each .. .}} ... {{/ each}} blocco. Li strappa completamente. Quelli sono gli unici tag che vengono rimossi.

+0

ok, andando a rispondere a questa domanda. il problema del modello sembra essere un problema separato. Grazie –

+0

@JeremyBell re: i tag mancanti, hai circondato il blocco {{#each}} con un tag '

'? In caso contrario, i tag '' e '
' vengono rimossi. –

-2

Non sono sicuro se questo il modo migliore, ma ho messo il item index o item name come proprietà del tag e quindi usa jQuery per recuperarlo.

// template 
{{#each App.itemsController}} 
     <tr itemName="{{itemName}}"> 
      <td>{{itemName}}</td> 
      <td><a href="#" {{action "removeItem" on="click"}}>Delete</a></td> 
     </tr> 
{{/each}} 


// Javascript 
window.App.ListView = Ember.View.create({ 
    templateName: 'listView', 

    removeItem: function (event) { 
     var id = this.$().parent().parent().attr('itemName'); 
     ... 
    } 
}); 

Spero che questo aiuti.

2

Grazie a T om Whatmore fiddle ho trovato risposta alla stessa domanda.

Dopo aver letto trek intro, anziché personBinding="this", preferisco utilizzare {{action removeItem person}} per indicare esplicitamente l'oggetto su cui deve essere eseguita l'azione.

<script type="text/x-handlebars"> 
<table> 
    {{#each person in App.peopleController}} 
     {{#view App.PersonView}} 
      <td>{{person.fullName}}</td> 
      <td><button {{action removeItem person}}>Delete</button> 
     {{/view}} 
    {{/each}} 
</table> 
</script> 

Nella vista userei var person = evt.context; per ottenere persona oggetto.

App = Ember.Application.create(); 

App.Person = Ember.Object.extend({ 
    fullName: function() { 
     return this.get('firstName') + ' ' + this.get('lastName'); 
    }.property('firstName', 'lastName') 
}); 

App.peopleController = Ember.ArrayProxy.create({ 
    content: [App.Person.create({ firstName: "Yehuda", lastName: "Katz" }), 
    App.Person.create({ firstName: "Tom", lastName: "Dale" })] 
}); 

App.PersonView = Ember.View.extend({ 
    tagName: 'tr', 
    removeItem: function(evt) { 
     var person = evt.context; 
     App.peopleController.removeObject(person); 
    } 
}); 

Si può giocare con questo violino jsfiddle.net/67GQb/127

+0

Secondo [ Documentazione ArrayController] (http://emberjs.com/api/classes/Ember.ArrayController.html), è consigliabile utilizzare ArrayController anziché ArrayProxy perché concettualmente è un controller. – penkovsky

Problemi correlati