在自定义绑定处理程序中使用非可观察对象

时间:2014-09-03 10:15:24

标签: javascript jquery knockout.js

我想在knockout.js自定义绑定中使用变量。特别是在init回调中的事件处理程序中。

示例:

ko.bindingHandlers.test = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        var $element = $(element);
        var f = valueAccessor();

        $element.mousedown(function(e) {
            f = true;
        });
    },
    update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        var f = valueAccessor();
    }
};

型号:

var ViewModel = function() {
    this.flag = false;
};

这是fiddle

问题是:如果在元素上触发mousedown,则flag未在模型中更新。

问题在于这一行:

var f = valueAccessor();

复制值而不是参考。布尔是原始人。

我可以使flag可观察,因此它是一个函数,我在处理程序中有引用。但我不想要一个可观察的...我只是不需要'通知听众改变'这里的功能。

我还可以做一个包装函数或其他东西......但是......一个函数只是为了得到一个布尔的引用?

我需要此功能才能报告绑定的“状态”。外部函数有时需要这些信息,但他们不希望在价值变化时注意到结果。

是否有最佳做法或什么?

1 个答案:

答案 0 :(得分:1)

关于

  

我只是不需要在这里通知听众更改' -feature

如果这是一个足够强大的理由不使用可观察的话。如果您使用可观察的实际优势,是否存在任何实际缺点

Knockout充满了可观察性和其他更复杂的东西。如果你"保存"你真的没有任何收获。一个可观察的。毕竟,在它们提供好处的地方使用它们,这就是框架的用途。

如果你没有观察者的订阅者而只是为了保持某种内部状态而使用它 - 这是使用观察者的完美理由。

如果你绝对,肯定必须避免使用observable,你可以传递viewModel属性的名称:

ko.bindingHandlers.test = {
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        var propertyName = valueAccessor();

        $(element).mousedown(function(e) {
            viewModel[propertyName] = true;
        }).mouseup(function(e) {
            viewModel[propertyName] = false;
        });
    }
};

<input type="text" data-bind="test: 'flag'">