我正在创建一个Knockout绑定,它将作为jQuery小部件的包装器。此小部件将事件处理程序应用于子元素。不幸的是,窗口小部件的事件处理直接应用于子元素,而不是委托。问题是我对同一个元素有一个foreach
绑定,但我需要在应用foreach
绑定后应用来应用自定义绑定。
显然,正确的做法是修复jQuery插件,但目前这不是一个选项。我想知道我是否有任何好的解决方案选项。例如,是否有办法执行以下任何操作?
更新
我应该提到的一个方面是这个自定义和foreach
绑定驻留在模板中。因此,直接修改DOM的解决方案对我来说不起作用,因为它实际上会修改模板。
答案 0 :(得分:7)
在bindingHandler上添加一个具有依赖项数组的after属性
ko.bindingHandlers.myHandler = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// Actual code
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// Actual code
},
after:['foreach']
};
答案 1 :(得分:2)
我找到了一种解决方法,但它比我喜欢的更糟糕。我还在等待更好的答案。
我所做的只是这个:
ko.bindingHandlers.myHandler = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
if (allBindingsAccessor().foreach) {
setTimeout(doInit, 1);
} else {
doInit();
}
function doInit() {
bindingContext.initializedMyHandler = true;
// Actual code
}
},
update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
if (bindingContext.initializedMyHandler) {
doUpdate();
} else {
setTimeout(doUpdate, 1);
}
function doUpdate() {
// Actual code
}
}
};
基本上我只是使用超时来延迟执行。这样,其余的绑定处理程序将首先执行。
答案 2 :(得分:2)
如果您的绑定依赖于foreach绑定,为什么不从自定义绑定中调用它?那么你甚至不需要在data-bind属性中提供它。前几天我帮助了另一个SO用户,检查我如何从自定义绑定中调用选项绑定
ko.applyBindingsToNode(element, { options: valueAccessor(), optionsCaption: caption, optionsText: optionsText }, viewModel);