2012-02-21 16 views
6

Considérese una vista que define una lista de objetos:Cómo pasar eventos a una Vista principal, pasando al niño Vista que desencadenó el evento?

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

    itemClicked: function(item){ 

    } 
)}; 

con la plantilla:

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

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

Así que básicamente mi pregunta es ¿cómo puedo pasar las vistas de eventos a padres, especialmente en el caso donde la vista secundaria no es conocida por la vista secundaria? Entiendo que puede obtener una propiedad foo de parentView con this.getPath('parentView').get('foo') o this.getPath('contentView').get('foo'). Pero, ¿qué pasa con una función (en este caso, itemclicked())?

Respuesta

7

this.get('parentView').itemClicked(this.get('item')); deberían hacer el truco.

+0

pensé que prueba que, y no funcionó. Haré un jsFiddle para probarlo. Estoy bastante seguro de que 'this.get ('contentView'). ItemClicked (this.get ('item'));' (para pasar eventos a abuelos) no funcionará. –

+0

@Zack Parece que funciona aquí: http://jsfiddle.net/tomwhatmore/FGyrV/1/ a menos que, por supuesto, haya entendido mal la pregunta. ¿Podría ser porque estaba usando 'getPath()' en lugar de 'get()'? –

+0

Yeap, estaba usando getPath :) –

3

Usted puede utilizar el ayudante {{action}}, ver: http://jsfiddle.net/smvv5/

Plantilla:

<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

¿Esto realmente funciona en la última versión de Ember? El evento click nunca parece pasar ningún parámetro al método click. simplemente aparece con undefined para 'view',' event' y 'ctx' – Wasim

0

Las versiones recientes de Ember usar el hash actions en lugar de métodos directamente en el objeto (aunque este método desaprobado aún se admite, puede que no sea por mucho tiempo). Si desea una referencia a la vista pasada al controlador, envíe a través de "ver" como parámetro y use el parentView como destino.

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

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

{{action}} ayudante no envía a través del objeto de evento. Aún no estoy seguro de cómo obtener una referencia del evento si lo necesita.

source

Cuestiones relacionadas