我已经使用这个jsfiddle来说明我遇到的问题:
var model = {
a: ko.observable(false),
b: ko.observable(false),
c: ko.observable(false),
data: ko.observable(''),
isValid: function () {
return this.a() && this.b() && this.c();
}
};
model.allTrue = ko.computed(function () {
return this.a() && this.b() && this.c();
}, model);
model.query = ko.computed(function () {
return 'a = ' + this.a() + '; b = ' + this.b() + '; c = ' + this.c() + ';';
}, model);
model.query.subscribe(function () {
if (this.isValid()) {
// load some data...
this.data(this.query());
}
else {
this.data('no value');
}
}, model);
ko.applyBindings(model);
该模型有三个布尔可观察量; a,b和c。 计算的observable(allTrue)计算它们是否都为真。 另一个计算的observable(查询)是a,b和c的摘要。
如果我手动订阅“查询”以加载一些数据,但首先检查“allTrue”,“allTrue”可能还没有更新和更正,因为更新其值的过程发生在回调触发后。
例如,检查a,然后是b,然后是c,并在计算计算出的“allTrue”之前调用回调。
我试图做的是异常,还是有办法让它起作用?
也许使用计算机没有任何优势,事实上,如果我用普通函数(isValid)替换它,我会得到我期望的行为。但是我打算让其他东西对allTrue / isValid值做出反应,我想我通常会在这种情况下使用计算器(正常函数也可以工作,但我认为在那里使用计算通常会有好处)。
答案 0 :(得分:1)
我认为您没有理由需要使用手动订阅。如果您不打算允许写入data
属性,那么您也可以将其计算出来。
model.data = ko.computed(function () {
if (this.allTrue()) {
return this.query();
}
else {
return 'no value';
}
}, model);
答案 1 :(得分:1)
如果query
除非所有条款都可用,否则query
无效,最好将该评估推送到var model = {
a: ko.observable(false),
b: ko.observable(false),
c: ko.observable(false),
data: ko.observable('')
};
model.allTrue = ko.computed(function () {
return this.a() && this.b() && this.c();
}, model);
model.query = ko.computed(function () {
return this.allTrue() ?
'a = ' + this.a() + '; b = ' + this.b() + '; c = ' + this.c() + ';'
: null;
}, model);
model.query.subscribe(function (query) {
if (!query) {
this.data('no value');
return;
}
// load some data...
this.data(query);
}, model);
ko.applyBindings(model);
observable以加强依赖关系:
http://jsfiddle.net/gt8d2mub/1/
{{1}}