2012-02-07 14 views
19

Tengo una lista de los objetos:¿Cómo pasar parámetros con la acción Helper of Ember.js?

<ul> 
    {{#each applications}} 
     <li> 
     <a {{bindAttr href="url"}} 
     {{action "appClicked" on="click"}}>     
      {{name}} 
     </a> 
     </li> 
    {{/each}} 
    </ul> 

al hacer clic llama al método appClicked de la vista, que esta plantilla pertenece. Quiero pasar algo de información (por ejemplo, el nombre de la aplicación) al método appClicked. Algo así como, {{action "appClicked(name)" on="click"}}.

¿Es posible y cómo?

+1

No existe actualmente una manera de hacer lo que quiera y yo pensaría que al hacerlo doesn' suena bastante bien Sé que esto es solo un pequeño fragmento de lo que sea que intentes hacer, pero no deberías necesitar pasar la propiedad 'nombre' (o cualquier otra cosa) a tu acción. El objetivo debe ser la vista actual en la lista. ¿Podría proporcionar un jsFiddle y quizás explicar un poco más qué problema está tratando de resolver? –

+0

Es posible hacer la respuesta aquí desde la API http://stackoverflow.com/a/18473842/551811 – BraveNewMath

Respuesta

5

que estaba pensando algo más en la línea de este ya que tendrá acceso a un montón más a través de un punto de vista real. Pero Zack, si pudieras explicar un poco más, ¿qué es exactamente lo que estás tratando de hacer si esto no es lo que estás buscando?

http://jsfiddle.net/ud3323/4ysxQ/

+0

Vi esa solución, en algún lugar en SO (respondida por Katz). Según tengo entendido, debe crear una vista separada para * cada * elemento del que desea rastrear eventos (clic, enfoque, etc.). ¿Estoy en lo correcto? También encontré este tirón https://github.com/emberjs/ember.js/pull/451, no estoy seguro si esto es lo que estoy buscando. –

+0

Lo expliqué en una [respuesta anterior] (http://stackoverflow.com/questions/8870785/positional-index-in-ember-js-collections-iteration/) también y sí, estás en lo cierto. Hay algunos problemas de rendimiento al generar listas muy grandes que usan vistas regulares (creo que una de las razones por las que se está depreciando el #collection helper). Sin embargo, si miras mi solución, cambio la vista secundaria a una vista Metamorph que casi elimina la diferencia de rendimiento entre #collection y #each helpers. De todos modos, esta es la forma en que probablemente deberías hacer esto. No estaría demasiado preocupado con ese tirón requerido. –

+0

He creado una versión de jsfiddle en esta respuesta que es compatible e idiomática para Ember 1.0. Siéntase libre de actualizar su respuesta con este enlace, Roy: http://jsfiddle.net/tL4Xt/ –

-2

Usted puede tratar de hacer que el parámetro de un atributo de la <li> o < una etiqueta > y luego usar jQuery para acceder a ella.

tal vez algo como

// template 
<ul> 
    {{#each applications}} 
    <li> 
     <a {{bindAttr href="url"} param="abc"} 
     {{action "appClicked" on="click"}}>     
     {{name}} 
     </a> 
    </li> 
    {{/each}} 
</ul> 

// In your js code 
appClicked: function (event) { 
    // You may have to play around and check which DOM element 
    // has the the param attribute. From memory it is the parent. 
    var param = this.$().parent().attr('param'); 
    ... 
} 
1

De subvistas, puede adjuntar ficha atributos y acceder a ellos en su controlador.

Por ejemplo, en su opinión, si tiene:

{{#view Ember.Button target="App.controller" action="publish" data-publish=false}}Unpublish{{/view}} 

Luego, en su controlador,

App.controller = Ember.Object.extend({ 
    publish: function(v){ 
    var status = v['data-publish'];//your additional information is appended to the view. 
    } 
} 
-1

Una mejora de la respuesta de Veeb, recuerda que tienes el evento jQuery para que pueda hacer :

// template 
<ul> 
    {{#each applications}} 
    <li> 
     <a {{bindAttr href="url"}} param="abc" {{action "appClicked" on="click"}}> 
     {{name}} 
     </a> 
    </li> 
    {{/each}} 
</ul> 

// In your js code 
appClicked: function (event) { 
    var param = $(event.target).attr('param'); 
    ... 
} 
16

al parecer, Ember ha evolucionado y hay una posibilidad de pasar un parámetro a una a cción:

{{action "functionName" parameter}} 

En su caso, que sería:

<a {{bindAttr href="url"}} 
    {{action "appClicked" name on='click'}}>     
     {{name}} 
    </a> 

Sin embargo, usted podría pasar cualquier atributo del modelo (como el id) en lugar del nombre.

Consulte http://emberjs.com/guides/templates/actions/ para obtener más información.

14

The API says puede pasar en múltiples parámetros.

html y el manillar:

{{officename}} 
<button {{action "actionTest" "hello" "goodbye" officename}}>See parameters through action in the console</button> 

controlador:

actionTest: function(a, b, c){ 
    console.log(a); 
    console.log(b); 
    console.log(c); 
}, 

See it in action in this jsbin

+2

A partir de la versión Ember 1.0, este JSBin ya no se ejecuta. Es posible que desee actualizarlo @HaoQu Li –

Cuestiones relacionadas