2012-02-21 15 views
6

consideri una visualizzazione che definisce un elenco di oggetti:Come passare eventi a una vista padre, passando la vista figlio che ha attivato l'evento?

App.ListView = Ember.View({ 
    items: 'App.FooController.content' 

    itemClicked: function(item){ 

    } 
)}; 

con il modello:

<ul> 
{{#each items}} 
    {{#view App.ItemView itemBinding="this" tagName="li"}} 
     <!-- ... --> 
    {{/view}} 
{{/each}} 
</ul> 

e l'ItemView:

App.ItemView = Ember.View.extend({ 

    click: function(event){ 

    var item = this.get('item'); 

    // I want to call function itemClicked(item) of parentView 
    // so that it handles the click event 
    } 
}) 

Quindi, in pratica la mia domanda è: come faccio a passare eventi alle viste genitore, specialmente nel caso in cui la vista genitore non sia conosciuta dalla vista figlio? Comprendo che è possibile ottenere una proprietà foo di un parentView con this.getPath('parentView').get('foo') o this.getPath('contentView').get('foo'). Ma che dire di una funzione (in questo caso, itemclicked())?

risposta

7

this.get('parentView').itemClicked(this.get('item')); dovrebbe fare il trucco.

+0

ho pensato che prova che, e non ha funzionato. Farò un jsFiddle per testarlo. Sono piuttosto sicuro 'this.get ('contentView'). ItemClicked (this.get ('item'));' (per passare eventi a nonni) non funzionerà. –

+0

@Zack Sembra funzionare qui: http://jsfiddle.net/tomwhatmore/FGyrV/1/ a meno che, naturalmente, non abbia frainteso la domanda. Potrebbe essere perché stavi usando 'getPath()' invece di solo 'get()'? –

+0

Yeap, stavo usando getPath :) –

3

È possibile utilizzare il {{action}} aiutante, si veda: http://jsfiddle.net/smvv5/

Template:

<script type="text/x-handlebars" > 
    {{#view App.ListsView}} 
     {{#each items}} 
      {{#view App.ListView itemBinding="this" }} 
       <li {{action "clicked" target="parentView" }} >{{item.text}}</li> 
      {{/view}} 
     {{/each}} 
    {{/view}} 
</script>​ 

JS:

App = Ember.Application.create({}); 

App.Foo = Ember.ArrayProxy.create({ 
    content: [Ember.Object.create({ 
     text: 'hello' 
    }), Ember.Object.create({ 
     text: 'action' 
    }), Ember.Object.create({ 
     text: 'world' 
    })] 
}); 
App.ListsView = Ember.View.extend({ 
    itemsBinding: 'App.Foo', 
    clicked: function(view, event, ctx) { 
     console.log(Ember.getPath(ctx, 'item.text')); 
    } 
}); 
App.ListView = Ember.View.extend({ 
});​ 
+1

Questo funziona effettivamente sull'ultima versione di Ember? L'evento click non sembra mai passare alcun parametro al metodo click. viene fuori con undefined per 'view',' event' e 'ctx' – Wasim

0

versioni recenti di Ember utilizzare il actions hash invece di metodi direttamente sul oggetto (sebbene questo metodo deprecato sia ancora supportato, potrebbe non essere a lungo). Se si desidera un riferimento alla vista passata al gestore, inviare tramite "Visualizza" come parametro e utilizzare lo parentView come destinazione.

<button {{action "onClicked" view target="view.parentView"}}>Click me.</button> 

App.ListsView = Ember.View.extend({ 
    actions: { 
     onClicked: function(view) { 
     } 
    } 
}); 

{{action}} aiutante non invia tramite l'oggetto evento. Non sei ancora sicuro su come ottenere un riferimento all'evento se ne hai bisogno.

source

Problemi correlati