3

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

这是我在视图模型中得到的:

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 的值更改时执行我的订阅函数体。有没有办法让我跟踪我的可观察对象以查看变化发生在哪里?

4

2 回答 2

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/

于 2013-12-13T02:45:34.453 回答
2

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

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

相对于:

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

这可能会给您带来您正在谈论的问题,因为在绑定中调用了该函数。

于 2013-12-14T13:44:33.457 回答