是否可以使用其他选项扩展淘汰赛中的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 }" />
这可能还是需要自定义绑定?
答案 0 :(得分:4)
有关包装现有绑定的信息,请参阅第3节here。要点是init
部分,您致电ko.bindingHandlers.text.init
,update
也是如此。围绕这些电话,你可以做任何你喜欢的事情。如果您要包装的绑定没有初始化或更新,您将收到错误消息,您可以删除该调用。
答案 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" });