【问题标题】:Knockout custom binding handler淘汰赛自定义绑定处理程序
【发布时间】:2012-09-04 02:31:01
【问题描述】:

我无法让它工作:http://jsfiddle.net/2jg2F/1/

我基本上想创建一个链接,当有人单击文本时,该链接会更改为输入框。我已经尝试过淘汰赛 2.0 和 2.1。

HTML

<div data-bind="clickToEdit : message"> </div>

Javascript

ko.bindingHandlers.clickToEdit = {
    init: function(element, valueAccessor) {
        var observable = valueAccessor(),
            link = document.createElement("a"),
            input = document.createElement("input");

        element.appendChild(link);
        element.appendChild(input);

        observable.editing = ko.observable(false);
        ko.applyBindingsToNode(link, {
            text: observable,
            visible: !observable.editing,
            click: function() {
                observable.editing(true);
            }
        });

        ko.applyBindingsToNode(input, {
            value: observable,
            visible: observable.editing,
            hasfocus: observable.editing
        });
    }
};

function ViewModel() {
    this.message = ko.observable("Click on me to edit");
}
ko.applyBindings(new ViewModel());

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    你的问题出在这一行:

    visible: !observable.editing
    

    这将评估为 false 并将保持这种状态。就算你做!observable.editing(),那也是静态的真值。

    所以,有几种方法可以处理它:

    1 - 一个不错的选择是创建一个快速的hidden 绑定处理程序,它只是将相反的值传递给可见绑定。有几种写法,这里有一个简单的方法:

    ko.bindingHandlers.hidden = {
        update: function(element, valueAccessor) {
            var isVisible = !ko.utils.unwrapObservable(valueAccessor());
            ko.bindingHandlers.visible.update(element, function() { return isVisible; });
        }        
    };
    

    现在,您可以使用:

    hidden: observable.editing
    

    这是一个示例:http://jsfiddle.net/rniemeyer/2jg2F/2/

    2 - 另一种选择是添加一个返回相反的计算 observable。比如:

        observable.editing = ko.observable(false);
        observable.notEditing = ko.computed(function() {
           return !observable.editing(); 
        });
    

    然后,绑定notEditing,例如:

    http://jsfiddle.net/rniemeyer/2jg2F/3/

    【讨论】:

    • 感谢这完美的作品。我也尝试过 !observable.editing() 一次,但它的行为就像一个静态的 true。静态行为让我陷入了循环。
    • 顺便说一句,您在knockmeout.net 上的演示非常好。如果还不是很明显,那就是我得到这段代码的地方。我想知道你是否有一些我在代码清单中没有看到的“隐藏”绑定的技巧。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2016-03-31
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多