我在一个可观察对象上有一个订阅函数。我假设订阅函数应该只在其可观察对象发生更改时执行。尽管当我跟踪代码时,我可以看到它是在初始化时调用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>
当函数在绑定中被调用时,这可能会给您带来您正在讨论的问题。