对于使用计算的observable的订阅回调函数是否有效

时间:2014-11-19 13:29:45

标签: javascript knockout.js

我已经使用这个jsfiddle来说明我遇到的问题:

http://jsfiddle.net/gt8d2mub/

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值做出反应,我想我通常会在这种情况下使用计算器(正常函数也可以工作,但我认为在那里使用计算通常会有好处)。

2 个答案:

答案 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}}