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.
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 –
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. –
Gracias, gran aporte de ambos. Knockouts enlaces personalizados es tan poderoso. Pero en este caso, creo que voy con el CSS. – user1199595