在淘汰赛中扩展文本绑定

时间:2015-08-25 20:59:58

标签: javascript knockout.js

是否可以使用其他选项扩展淘汰赛中的text绑定?例如:

ko.bindingHandlers.text = {
    update: function(element, valueAccessor, allBindingsAccessor){
        var options = allBindingsAccessor().textOptions || {};
        options = _.extend({
            'required': false
        }, options);
        if(options['required']){
            // Do some required things
        }
    }
};

那么文本绑定可以写成:

<span data-bind="text: myText, textOptions: { required: true }" />

这可能还是需要自定义绑定?

2 个答案:

答案 0 :(得分:4)

有关包装现有绑定的信息,请参阅第3节here。要点是init部分,您致电ko.bindingHandlers.text.initupdate也是如此。围绕这些电话,你可以做任何你喜欢的事情。如果您要包装的绑定没有初始化或更新,您将收到错误消息,您可以删除该调用。

答案 1 :(得分:2)

嗯,那不是扩展 text绑定,你覆盖它。

首先,请注意,目前text绑定非常简单。取自the source

ko.bindingHandlers['text'] = {
    'init': function() {
        // Prevent binding on the dynamically-injected text node (as developers are unlikely to expect that, and it has security implications).
        // It should also make things faster, as we no longer have to consider whether the text node might be bindable.
        return { 'controlsDescendantBindings': true };
    },
    'update': function (element, valueAccessor) {
        ko.utils.setTextContent(element, valueAccessor());
    }
};

实际功能被卸载到setTextContent,它处理文本内容的跨浏览器设置。

如果你想拥有一个与text类似的绑定,只有一些添加的功能,最简单的方法可能是 自己创建一个自定义绑定处理程序,利用{{ 1}}。例如:

setTextContent
ko.bindingHandlers['myText'] = {
    'init': function() {
        return { 'controlsDescendantBindings': true };
    },
    'update': function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor()), txt = '';
        if (value !== null && typeof value == "object") {
            txt = value['text'];
            if (!!value['required']) { txt += "!!!"; }
          
        } else {
            txt = value;
        }
        ko.utils.setTextContent(element, txt);
    }
};

ko.applyBindings({ testProperty: "test text 1234" });