6

我正在创建一个 Knockout 绑定,它将作为 jQuery 小部件的包装器。此小部件将事件处理程序应用于子元素。不幸的是,小部件的事件处理直接应用于子元素,而不是委托。问题是我foreach在同一个元素上有一个绑定,但我需要在应用绑定foreach应用自定义绑定。

显然,正确的做法是修复 jQuery 插件,但目前这不是一个选项。我想知道是否有任何适合我的解决方法。例如,有没有办法执行以下任何操作?

  1. 检测是否应用了特定绑定
  2. 影响绑定应用的顺序
  3. 安全地强制进行另一个绑定

更新:

我应该提到的一个方面是这个自定义和foreach绑定驻留在模板中。因此,直接修改 DOM 的解决方案对我不起作用,因为它实际上会修改模板。

4

3 回答 3

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']
};
于 2014-09-03T16:33:57.420 回答
3

如果您的绑定依赖于 foreach 绑定,为什么不从您的自定义绑定中调用它呢?然后你甚至不需要在 data-bind 属性中提供它。前几天我帮助了另一个 SO 用户,检查我如何从自定义绑定中调用选项绑定

http://jsfiddle.net/w9bsc/42/

ko.applyBindingsToNode(element, { options: valueAccessor(), optionsCaption: caption, optionsText: optionsText  }, viewModel);
于 2012-12-25T00:03:09.107 回答
2

我找到了一种解决方法,但它比我喜欢的更像是一种 hack。我仍然会等待更好的答案。

我所做的只是这样:

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
        }
    }
};

基本上我只是使用超时来推迟执行。这样,其余的绑定处理程序将首先执行。

于 2012-12-24T22:52:34.397 回答