2012-05-25 17 views
18

¿Es posible obtener el elemento (o elementos) correspondiente al que está asociada una instancia de datos (modelo)?KnockoutJs: Obtiene el elemento vinculado de una instancia modelo

Por ejemplo, tengo una matriz de tiendas de objetos 'Person' en una propiedad de ViewModel.

Ato el ViewModel a la vista que la hace, por ejemplo:

<div class="people" data-bind="template: { foreach: people }"> 
    <a href="#" class="person" data-bind="text: name"></a> 
</div> 

entonces Ato algunos controladores de eventos a través de jQuery:

$container.on('click', '.person', function(e){ 
    e.preventDefault(); 
    self.showPerson(ko.dataFor(this)); 
}); 

En mi método showPerson I ahorraría una referencia al modelo. Yo/podría/también a guardar una referencia al elemento, pero no quiero si no es necesario.

self.showPerson = function(person) { 
    // can i get the corresponding element from the 'person' model? 
}; 

¿Alguien tiene alguna idea?

Respuesta

8

Su sintaxis y uso de $ contenedor con jquery y el segundo argumento de '.person' es unfamil iar a mí, pero en su controlador de clics, ¿no está this el elemento al que se hizo clic? ¿No podrías pasar eso a tu método showPerson también?

$container.on('click', '.person', function(e){ 
    e.preventDefault(); 
    self.showPerson(ko.dataFor(this), this); 
}); 

self.showPerson = function(person, element) { 
    // can i get the corresponding element from the 'person' model? 
}; 

no sé de una manera fuera de la parte superior de la cabeza para obtener los elementos que un observable está obligado a, pero puede haber varios elementos diferentes. Puede tener un cuadro de texto para 'nombre', mostrar el nombre en un lapso, usarlo en una longitud calculada, tener suscriptores y usar nombre(). En un cálculo en otro enlace, por ejemplo.

Dicho esto, si utiliza la versión de depuración de knockout, puede ver que sus observables tienen una propiedad _subscriptions que podría tener lo que está buscando. La versión minificada es un personaje único, creo.

+0

Gracias por la respuesta. Por supuesto, la manera más fácil de hacerlo es guardar una referencia al elemento, pero en mi pregunta he mencionado que no quiero hacer esto si no es necesario. Pero creo que su respuesta ha confirmado que no es posible obtener una lista de los elementos a los que el observable estaba obligado, lo que creo que le falta método de método de inacción API. – badsyntax

5

¿Por qué no mueve el enlace de evento click dentro de su foreach?

<a href="#" class="person" data-bind="text: name, click: showPerson"></a>

En este caso, su función showPerson() tendría los datos correctos para person

EDIT:

Lo sentimos, pero supongo que me perdí el núcleo de su pregunta:

self.showPerson = function (person, event) { 
    element = event.srcElement 
    ... 
} 
+0

Gracias por la respuesta, pero eso no es lo que estoy preguntando. 'showPerson()' obtiene los datos correctos. Me pregunto si puedo obtener el elemento correspondiente de la instancia del modelo que se pasa a 'showPerson()' – badsyntax

+0

event.srcElement solo funciona en IE. – vijayst

0
self.showPerson = function(data, event) { 
    // event.currentTarget is the DOM element 
    // $(event.currentTarget) gives the jQuery element 
} 
+1

Me preguntaba si podría obtener el elemento del modelo, no de los parámetros del controlador de eventos. – badsyntax

15

Usted puede simplemente crear una unión

// data-bind="element: observable" 
    // sets observable to element .. 
    ko.bindingHandlers.element = { 
     init: function(element, valueAccessor) { 
      var target = valueAccessor(); 
      target(element); 
     } 
    }; 

En su modelo de vista personalizada, crear un 'campo' para almacenar el elemento:

person.el = ko.observable(null); 

Luego, en su plantilla html ..

<div data-bind="element: el"> .... </div> 
+2

Esta debería haber sido la respuesta, porque esa es la única solución en la página que me permite simplemente acceder al elemento enlazado desde el modelo de vista interno, no cuando se hace clic, sino tan pronto como está enlazado. –

Cuestiones relacionadas