1

我有一个自定义绑定,用于在视图模型上更改字段(“类型”)时重新初始化 dom 元素。这是在更新回调中定义的。

<input type="text" data-bind="value: Value, initValueField: Type()" />

ko.bindingHandlers.initValueField = {
    update:function (element, valueAccessor, allBindingsAccessor, viewModel) {
        alert('Hello World');
    }
};

请参阅此jsFiddle以获取精简演示。

据我了解,调用更新的条件之一如下:

自定义绑定的机制

任何时候触发同一数据绑定属性中的另一个绑定。这有助于确保在更改选项时,值之类的东西是合适的。

我遇到的问题是,只要 viewmodel 上的值发生更改,也会调用此更新回调。

那么......是否有可能:

  1. 禁止绑定之一调用自定义绑定。
  2. 检测自定义绑定中的调用源。
4

3 回答 3

1

我在这里找到了解决该问题的潜在解决方法:

Knockout.js 性能问题 #3 - 所有绑定一起触发

选项包括:

  1. 通过将绑定放在单独的元素(可能是容器元素)上来拆分绑定。
  2. 与第 1 点类似,但使用无容器绑定将它们分开。
  3. 在自定义绑定中使用计算的 observableinit来手动管理更新。
于 2012-11-27T15:59:21.520 回答
0

您也许可以检查可观察的变化。然后才执行动作。像这样的东西:

(function () {
    var cache;
    ko.bindingHandlers.initValueField = {
        init:function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var currentValue = valueAccessor();
            cache = currentValue();
        },
        update:function (element, valueAccessor, allBindingsAccessor, viewModel) {
            var currentValue = valueAccessor();
            if (cache !== currentValue()) {
                alert('Hello World');
                cache = currentValue();
            }
        }
    };
}());

缓存变量存储 observable的旧值。仅当当前值与旧值不同时才会发出警报。

工作小提琴:http: //jsfiddle.net/DMLzd/6/

于 2012-11-26T16:07:30.663 回答
0

您可以element在自定义绑定中使用参数来查看调用该绑定的 DOM 元素。请参阅http://jsfiddle.net/DMLzd/7/以了解自定义绑定中的条件,它使用id文本框的属性来决定是否执行操作。我添加了调用自定义绑定的具有不同 ID 的附加文本框和按钮。

于 2012-11-27T10:54:27.460 回答