2012-02-10 20 views
14

Tengo este código en jquery. ¿Cómo podría escribir esto en knockout con enlace? O es mejor tenerlo en jquery. ¿Hay alguna manera inteligente de saber cuándo escribirlo en enlace o en jquery? Esto es más viewstuff así que tal vez debería ser en Jquery?Knockoutjs bind mouseover o Jquery

$("body").on("mouseover mouseout", '.hoverItem', function() { 
    $(this).toggleClass('k-state-selected'); 
}); 

Respuesta

37

Si la conmutación de esta clase en realidad no necesita conectarse a los datos en su modelo de vista, entonces no hay realmente ninguna razón para que no se podía hacer lo que está haciendo ahora.

Este es un ejemplo de cómo hacerlo con los enlaces por omisión:

vista:

<ul data-bind="foreach: items"> 
    <li data-bind="text: name, event: { mouseover: toggle, mouseout: toggle }, css: { hover: selected }"></li> 
</ul> 

vista de código modelo:

var Item = function(name) { 
    this.name = ko.observable(name); 
    this.selected = ko.observable(false); 
    this.toggle = function() { 
     this.selected(!this.selected()); 
    } 
}; 

var viewModel = { 
    items: ko.observableArray([ 
     new Item("one"), 
     new Item("two"), 
     new Item("three") 
    ]) 
}; 

ko.applyBindings(viewModel); 

con los enlaces personalizados que incluso podría reducirlo hasta:

<ul data-bind="foreach: items"> 
    <li data-bind="text: name, hoverToggle: 'hover'"></li> 
</ul> 

vista del modelo:

ko.bindingHandlers.hoverToggle = { 
    update: function(element, valueAccessor) { 
     var css = valueAccessor(); 

     ko.utils.registerEventHandler(element, "mouseover", function() { 
      ko.utils.toggleDomNodeCssClass(element, ko.utils.unwrapObservable(css), true); 
     }); 

     ko.utils.registerEventHandler(element, "mouseout", function() { 
      ko.utils.toggleDomNodeCssClass(element, ko.utils.unwrapObservable(css), false); 
     });  
    } 
}; 

var Item = function(name) { 
    this.name = ko.observable(name); 
}; 

var viewModel = { 
    items: ko.observableArray([ 
     new Item("one"), 
     new Item("two"), 
     new Item("three") 
    ]) 
}; 

ko.applyBindings(viewModel); 

incluso se podría conseguir más sofisticados y tienen que funcione de una manera como delegado on poniendo la unión en un nivel superior y aplicar la palanca sobre la base de un selector.

En cuanto a una regla de oro, creo que depende del desarrollador si quieren usar el código de cableado o hacerlo declarativamente cuando la funcionalidad no requiere datos del modelo de vista. En su caso, probablemente sea lo suficientemente bueno como para seguir con on hasta que requiera datos de su modelo de vista.

+1

de acuerdo. si no se usan los datos, entonces es realmente arbitrario en qué medida lo haces. sin embargo, en este caso, ¿por qué no usar CSS para aplicar la clase mouseover? Esa es la manera más simple –

+0

Sí, si el selector/clase es estático, entonces podría ir en el CSS. La única consideración es que creo que IE7 tiene algunos problemas con: flotar. –

+0

Gracias, gran aporte de ambos. Knockouts enlaces personalizados es tan poderoso. Pero en este caso, creo que voy con el CSS. – user1199595

Cuestiones relacionadas