Knockout js订阅函数(用于可观察的)正在ko.applyBindings(...)中执行

时间:2013-12-13 02:30:42

标签: javascript knockout.js subscribe

我的一个可观察对象上有一个订阅功能。我假设订阅函数只应在它的可观察对象发生更改时执行。虽然当我跟踪我的代码时,我可以看到它在初始化后调用ko.applyBindings(MyViewModel);后正在执行。

以下是我在viewmodel中的内容:

function MyViewModel(myModel){
    this.myProperty = ko.observable(myModel.myProperty);

    this.myProperty .subscribe(function (val) {
        // do sth..
    }, this);
}

这是我调用applyBindings的地方:

jQuery(document).ready(
    function ($) {
       ko.applyBindings(MyViewModel);
});

这是预期的行为吗?

正在ko.applyBindings(MyViewModel);之后立即调用subscribe函数,这意味着我同时没有从UI获得任何输入。

我希望拥有它,这样只要myProperty的值发生变化,它就会执行我的订阅函数体。有没有办法让我跟踪我的可观察对象,看看发生了哪些变化?

2 个答案:

答案 0 :(得分:5)

设置订阅时,会在调用ko.applyBindings()时评估并触发订阅。

如果您只关注更改跟踪,则可以使用计算的observable并获得相同的结果。看起来您可以通过添加如下所示的{deferEvaluation:true}选项来推迟计算的observable在ko.applyBindings()上的计算:

例如:

    function MyViewModel(myModel){
        this.myProperty = ko.observable('someValue');
        this.runCode = ko.computed(function (val) {
            // do some stuff any time this.myProperty() is changed
            console.log(this.myProperty());
        }, this, {deferEvaluation: true});
    }

var vm = new MyViewModel();

ko.applyBindings(vm);

vm.runCode();

vm.myProperty('some new value2');

这将防止在评估代码时执行代码的默认行为。为了让它开始跟踪事件,当你想要它开始跟踪时,你必须调用计算机(在这种情况下为vm.runCode())。

下面是显示行为的更新小提琴:http://jsfiddle.net/amspianist/SL22M/2/

答案 1 :(得分:2)

您是否像这样引用绑定中的对象?

<div data-bind="text: myProperty()"></div>

而不是:

<div data-bind="text: myProperty"></div>

当你在绑定中调用函数时,这可能会给你所讨论的问题。