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

Knockout js subscribe function (for an observable) is being executed inside ko.applyBindings(...)

本文关键字:函数 用于 对象 观察 Knockout applyBindings ko 执行 js      更新时间:2023-09-26

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

以下是我在视图模型中得到的内容:

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

这是预期的行为吗?

subscribe函数是在ko.applyBindings(MyViewModel);之后立即调用的,这意味着在此期间我不会从UI获得任何输入。

我希望它只在myProperty的值更改时执行我的订阅函数体。有没有一种方法可以让我跟踪我的可观察物体,看看变化发生在哪里?

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

如果你只关注变化跟踪,你可以使用计算的可观察结果,并获得相同的结果。通过添加如下所示的{deferEvaluation:true}选项,您可以推迟在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');

这将防止在评估代码时执行代码的默认行为。为了让它开始跟踪事件,您必须在希望它开始跟踪时调用computed(在本例中为vm.runCode())。

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

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

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

与相反

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

当函数在绑定中被调用时,这可能会给您带来您正在讨论的问题。