如果这个类的切换真的不需要连接到你的视图模型中的数据,那么你真的没有理由不能做你现在正在做的事情。
以下是如何使用默认绑定的示例:
查看:
<ul data-bind="foreach: items">
<li data-bind="text: name, event: { mouseover: toggle, mouseout: toggle }, css: { hover: selected }"></li>
</ul>
查看模型代码:
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);
使用自定义绑定,您甚至可以将其缩减为:
<ul data-bind="foreach: items">
<li data-bind="text: name, hoverToggle: 'hover'"></li>
</ul>
查看模型:
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);
您甚至可以变得更复杂,并通过将绑定置于更高级别并基于选择器应用切换,使其以on 之类的委托方式工作。
根据经验,我认为当功能不需要来自视图模型的数据时,他们是要使用连线代码还是以声明方式执行,这取决于开发人员。在您的情况下,可能足以坚持使用on,直到它需要来自您的视图模型的数据。