2012-02-16 19 views
11

Con Knockout 2.0 utilizando estos datos, se unen:Los parámetros de Knockout 2.0 se unen en un orden incorrecto?

data-bind="click: $root.deleteSomeEntity.bind($data, $parent)" 

en el modelo de vista Knockout JavaScript primer argumento en

self.deleteSomeEntity = function (data, parent) { 
    // perform deletion 
} 

parece ser la raíz en vez de los datos.

¿Hay alguna razón para este comportamiento o algo que me falta?

Respuesta

12

Cuando llame al bind, el primer parámetro será el valor de this. Entonces, en su llamada this será $data y el primer argumento será $parent.

Si $root es $parent en este caso, a continuación, puedes hacer:

$root.deleteSomeEntity.bind($root)

KO pasará los datos como el primer parámetro y this se establecerá en $root.

Si no es $parent$root (y es probable que no quieren depender de this ser un objeto diferente que $root en su método de raíz), entonces usted podría hacer algo como:

$root.deleteSomeEntity.bind($root, $data, $parent)

De lo contrario, hay maneras de asegurarse de que tiene el this correcto dentro de su modelo de vista. Sin embargo, depende de tu estructura.

+0

Siguiendo sus sugerencias: http://jsfiddle.net/6MmWs/5/ sin embargo cuando al hacer clic en Eliminar y en la función 'self.deleteContactPhone = (viewModel, phone, contact)' viewModel es un teléfono, el teléfono es un contacto y el contacto también es un teléfono. 'this' es actualmente el modelo de vista. – kendaleiv

+1

Lo querrías más como: http://jsfiddle.net/rniemeyer/6MmWs/6/. Un par de cosas para mencionar. 'remove' es una función disponible en un array observable. Cambié tus arreglos de 'teléfonos' para que sean observables, de modo que tienes' remove' y tus actualizaciones de UI cuando se elimina uno. –

+0

La otra cosa es que quiere que la firma de su función sea 'función (teléfono, contacto)'. El primer parámetro para 'bind' es el objetivo, que se usa para controlar el valor de' this' cuando se ejecuta su función. Entonces, no es realmente un argumento para la función. –

2

¿Por qué está usando bind()? De forma predeterminada, si solo escribe el nombre de la función javascript como el evento click, Knockout pasará $data como primer argumento y el evento como segundo.

http://knockoutjs.com/documentation/click-binding.html (Nota 1 & 2)

por qué utilizar los bind() cuando simplemente puede hacer esto:

data-bind="click: function() {$root.deleteSomeEntity($data, $parent)}" 
+0

Ese código parece ejecutarse sin hacer clic para mí. Está dentro de un enlace de datos = "foreach: ..." si eso cambia algo. – kendaleiv

+0

¡Oh, por supuesto que sí! Lo siento, he editado el código para que 'function()' se ajuste al enlace de clic. Esto debería funcionar como se espera ahora. – soniiic

+1

Es solo una cuestión de estilo. A muchas personas no les gusta poner funciones anónimas en su marcado. Esta es una de las cosas que desactiva a las personas cuando comienzan en KO, especialmente cuando están acostumbradas a un enfoque más discreto. Funciona bien de cualquier manera, aunque prefiero asegurarme de que 'this' esté configurado apropiadamente en el propio modelo de vista. –

Cuestiones relacionadas