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

Zah*_*hra 3 javascript subscribe knockout.js

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

这是我在viewmodel中得到的:

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

    this.myProperty .subscribe(function (val) {
        // do sth..
    }, this);
}
Run Code Online (Sandbox Code Playgroud)

这是我调用applyBindings的地方:

jQuery(document).ready(
    function ($) {
       ko.applyBindings(MyViewModel);
});
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?

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

我想拥有它所以它只在myProperty的值被更改时才执行我的订阅函数体.有没有办法让我跟踪我的可观察对象,看看发生了哪些变化?

Jos*_*lor 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');
Run Code Online (Sandbox Code Playgroud)

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

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