如何动态添加元素绑定?

时间:2013-12-02 19:30:16

标签: knockout.js custom-binding

如果我有一个自定义绑定聚合其他人,如下所示:

ko.bindingHandlers.binding1 = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var ctx = ko.utils.unwrapObservable(valueAccessor());

        ko.applyBindingsToNode(element, { 'binding2': ctx });        
        ko.applyBindingsToNode(element, { 'binding3': ctx });        
    }
};

“allBindingsAccessor”仅返回其init函数的当前绑定。

我原以为它会在binding2“init”函数上返回binding1和binding2,在binding3“init”函数上返回binding1,2和3。

以下小提琴显示了我提到的行为。 http://jsfiddle.net/J3sjq/5/

问题是我的binding3依赖于其他绑定存在,例如binding2。

实施该行为的最佳方式是什么?我正在考虑修改上下文以通知其他绑定存在,但它听起来有点像黑客。

提前致谢。

编辑:

我已经更新了我的小提琴,以显示更多原始问题,我试图简化,但我可能已经过度了。

http://jsfiddle.net/J3sjq/6/

在新的小提琴中,binding1被初始化3个其他复杂绑定的initFieldStatus替换,每个绑定计算输入字段状态,isInputAtWarning绑定依赖于在元素上声明的其他绑定。

希望这会澄清这个问题。

三江源。

编辑2:

我提供了一个关于我想要实现的更真实世界的例子。

http://jsfiddle.net/J3sjq/8/

1 个答案:

答案 0 :(得分:0)

您可以直接调用绑定的ko.applyBindingsToNode函数,而不是调用init

ko.bindingHandlers.isInputAtWarning.init(
    element, function() { return observable.isInputAtWarning }, 
    allBindingsAccessor, viewModel, bindingContext);

http://jsfiddle.net/mbest/J3sjq/9/

但是如果你只是直接调用它,你也可以把它变成一个函数。

function isInputAtWarning(element, value, allBindingsAccessor) {
    ...
}

...    

isInputAtWarning(element, observable.isInputAtWarning, allBindingsAccessor);