【问题标题】:KnockoutJS value toggling in data-bind数据绑定中的 KnockoutJS 值切换
【发布时间】:2013-01-29 20:18:48
【问题描述】:

我有一点 javascript:

function ViewModel() {
    var self = this;
    self.highlight = ko.observable(true);   
}

ko.applyBindings(new ViewModel());

以及补充它的html:

<div data-bind="css: { highlighted: highlight }, click: highlight( !highlight() )">
    random string
</div>

我想要达到的目标:

  1. 只有在 var highlight 为 true 时才会激活 CSS 类“highlighted”
  2. 点击 div 会切换 var highlight 的 bool 值
  3. 想要的结果:单击 div 以激活/停用其 css 类

我得到了什么:

  1. highlight 的初始值为true,但 css 类开始停用(如果我将初始值更改为 false,css 类被激活:似乎我以某种方式触发了点击绑定我还没有点击任何东西)
  2. div 的 css 类不会在点击时切换

我宁愿不在 ViewModel 中创建一个新的对应点击函数。如果可能的话,我正在寻找一些我可以在数据绑定中单独放置的代码。

这是 JSFiddle 上的代码:http://jsfiddle.net/4wt4x/1/

谁能解释发生了什么以及我做错了什么?

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    我知道这是一个老问题,但也许可以帮助某人。 如果您需要在很多地方使用切换,也许一些自定义绑定糖可以帮助您:

    绑定:

    ko.bindingHandlers.toggleClick = {
        init: function (element, valueAccessor) {
            var value = valueAccessor();
    
            ko.utils.registerEventHandler(element, "click", function () {
                value(!value());
            });
        }
    };
    

    用法:

    <div data-bind="css: { highlighted: highlight }, toggleClick: highlight">
        random string
    </div>
    

    示例:

    http://jsfiddle.net/A28UD/1/

    这种方法使我的一些观点非常清晰。希望对您有所帮助。

    【讨论】:

    • ko.utils.registerEventHandler +1
    • 这正是我想要的
    • 不错 - 但我认为将这段代码保留在 JS 中更易于维护(和可测试)
    【解决方案2】:

    您的click: highlight( !highlight() ) 不正确。 Click 将尝试执行一个函数,并且在初始化绑定时, highlight 将返回其值,这就是 click 将尝试执行的(truefalse 在您的情况下)。你需要做这样的事情:

    在您的 javascript 中,放置在您的模型中:

    self.toggleHighlight = function () { self.highlight(!self.highlight()) };
    

    然后将绑定更改为click: toggleHighlight

    像这样:http://jsfiddle.net/KDypD/1/

    您可能还需要调整突出显示的初始值,以反映您希望页面最初显示的方式。

    【讨论】:

    • 感谢您的回复。那么有没有办法在数据绑定本身内单独执行此操作?如果可能的话,这就是我正在寻找的。​​span>
    • 我个人认为将类似的东西放在绑定中是不好的做法。重点是让您的视图与您的 javascript 分开。但是,如果您真的想要这样,您可以将 click: function(self){self.highlight(!self.highlight())} 用于绑定,但我不建议您这样做,因为稍后调试会结束不得不在两个地方而不是一个地方找到 javascript。对于有多个贡献者的大型项目,这会成为一个问题。
    • 感谢您的回复和对视图结构的额外评论。我会接受你的想法并在 javascript 中创建函数。谢谢!
    【解决方案3】:

    另一种选择是使用可重用的自定义函数扩展(使用自定义函数而不是扩展器,因为没有参数而且看起来更干净):

    ko.observable.fn.toggleable = function () {
        var self = this;
        self.toggle = function () {
            self(!self());
        };
    
        return self;
    };
    

    用法

    self.highlight = ko.observable(true).toggleable(); 
    

    HTML

    <div data-bind="css: { highlighted: highlight }, click: highlight.toggle">
        random string
    </div>
    

    【讨论】:

    • 我更喜欢这种方法,因为您可以在任何类型的事件甚至代码中使用toggle 功能。
    【解决方案4】:

    如果你真的想内联:

    <div data-bind="click: highlight.bind($root, !highlight()), css: { highlighted: highlight } ">
        random string
    </div>
    

    其中 highlight 是可观察的布尔值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-22
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2017-10-18
      相关资源
      最近更新 更多