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的值被更改时才执行我的订阅函数体.有没有办法让我跟踪我的可观察对象,看看发生了哪些变化?
设置订阅时,将在调用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/
| 归档时间: |
|
| 查看次数: |
40746 次 |
| 最近记录: |