我的一个可观察对象上有一个订阅功能。我假设订阅函数只应在它的可观察对象发生更改时执行。虽然当我跟踪我的代码时,我可以看到它在初始化后调用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的值发生变化,它就会执行我的订阅函数体。有没有办法让我跟踪我的可观察对象,看看发生了哪些变化?
答案 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>
当你在绑定中调用函数时,这可能会给你所讨论的问题。