【问题标题】:knockout.js subscribe is not getting called on the first setknockout.js 订阅在第一组没有被调用
【发布时间】:2014-01-19 14:24:59
【问题描述】:
我有一个带有可观察对象的简单模型类。我只是想订阅它的集合。这是我的代码:
var dto = function (data) {
var self = this;
self.Value1 = ko.observable(data.Value1);
self.Value1.subscribe(function(){
console.log('here');
});
};
首次设置 Value1 时不会调用 console.log(即 ko.observable(data.Value1)
如何设置订阅功能在初始和更改时发生。
【问题讨论】:
标签:
javascript
knockout.js
knockout-3.0
【解决方案1】:
对于触发初始值的subscribe 函数没有真正的支持。
你可以做的是在你的subscribe之后调用valueHasMutated函数:
self.Value1.subscribe(function(){
console.log('here');
});
self.Value1.valueHasMutated();
或者您可以在订阅后设置初始值:
var dto = function (data) {
var self = this;
self.Value1 = ko.observable(); // only declare but not assign
self.Value1.subscribe(function(){
console.log('here');
});
self.Value1(data.Value1); // assign initial value
};
【解决方案2】:
改进一下理查德的回答。如果这是一种反复出现的情况,您不知道 observable 是否已经获得了一个值,但您想调用订阅者(如果有),那么您可以使用此函数扩展 KO 订阅,该函数与原始签名具有相同的签名订阅:
ko.subscribable.fn.subscribeAndCall = function(subscribingFunction, context, event) {
var subscribableValue = this();
this.subscribe(subscribingFunction, context, event);
if (subscribableValue !== undefined) {
subscribingFunction.call(context, subscribableValue);
}
};
它也适用于虚假的初始值,不会意外触发 observable 的任何其他订阅者。
原始问题的示例用法:
self.Value1.subscribeAndCall(function(){
console.log('here');
}, this);
【解决方案3】:
我认为subsribe function 不适合那样工作。换句话说,当您的observable 对象发生变化时,您可以在执行某些回调/逻辑时使用它。
来自@RP Niemeyer answer here:
要通知订阅者他们应该重新评估,您可以在可观察对象上使用valueHasMutated()
【解决方案4】:
我只是写这个供我自己使用:
koSubscribe = function(observable, callback){
observable.subscribe( callback );
if (observable()) {
observable.valueHasMutated();
}
}
它基于此处的其他答案。但是解决了“如果还没有设置怎么办?”的问题。
所以只要 observable 存在,这应该可以工作。
用法:koSubscribe(value1, function() {…}); 其中 value1 是 ko.observable。