【问题标题】:Knockoutjs bind mouseover or JqueryKnockoutjs 绑定鼠标悬停或 Jquery
【发布时间】:2012-03-02 20:44:07
【问题描述】:

我在 jquery 中有这段代码。我将如何在带有绑定的淘汰赛中写这个。 或者在 jquery 中有它更好。有没有一种聪明的方法可以知道何时在绑定或 jquery 中编写它?这是更多的视图,所以也许它应该在 Jquery 中?

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

【问题讨论】:

    标签: jquery knockout.js


    【解决方案1】:

    如果这个类的切换真的不需要连接到你的视图模型中的数据,那么你真的没有理由不能做你现在正在做的事情。

    以下是如何使用默认绑定的示例:

    查看:

    <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,直到它需要来自您的视图模型的数据。

    【讨论】:

    • 同意。如果不使用数据,那么您使用哪种方式真的很随意。但是在这种情况下,为什么不直接使用 CSS 来应用 mouseover 类呢?这是最简单的方法
    • 是的,如果选择器/类是静态的,那么它可以进入 CSS。唯一的考虑是我认为 IE7 存在 :hover 的一些问题。
    • 谢谢,你们两位的意见都很好。淘汰赛自定义绑定是如此强大。但在这种情况下,我想我会选择 css。
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2018-10-09
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多