Knockout pureComputed Not Working

时间:2017-03-17 17:21:11

标签: javascript knockout.js

我有一个荒谬的时间试图使用Knockout处理地址。我的结构是这样的:

    viewModel.buildings()[0].Address()...

地址是:

    var Address = function () {
        var self = this;
        self.cAddr1 = ko.observable("");
        self.cCity = ko.observable("");
        ...
        self.cDisplay = ko.pureComputed(function () {
            return self.cAddr1() + '<br>' + self.cCity() + ...;
        }
        self.AddressActions = new AddressActions();
    }

一切似乎都运转正常。每个建筑物都有一个地址,并且可观察的信息正确更新。 cDisplay也可以正常工作。

我想添加另一个计算/可观察/ /当地址改变时将调用属于AddressActions的函数的任何东西。我试过这个,但是console.log从来没有受到打击,这对我没有任何意义:

    var Address = function () {
        // Same as above...
        ...
        self.triggerAddressVerify = ko.pureComputed(function () {
            console.log('here');
            self.cAddr1(); self.cAddr2(); self.cCity(); self.cState(); self.cZip();
            self.AddressActions.VerifyAddress(self);
        }
    }

为什么这不起作用的任何想法?

结果 所以我对knockout.js来说还是新手(显然),但它的工作方式与我想的有点不同。我基本上使用了接受的答案,但将所有内容都包含在pureComputed中。这是我最后添加的内容:

    var Address = function () {
        ...
        self.addressChangeEvent = ko.pureComputed(function () {
            return self.cAddr1() + self.cAddr2() + self.cCity() self.cState() + self.cZip();
        }
        self.addressChangeEvent.subscribe(function () {
            self.AddressActions.VerifyAddress(self);
        }
    }

2 个答案:

答案 0 :(得分:3)

看起来您正在寻找subscribe而不是computed

self.cAddr1.subscribe(function(){
    self.AddressActions.VerifyAddress(self);
});

您可以为

所需的每个变量添加订阅

答案 1 :(得分:1)

纯计算的Knockout文档明确表示当您打算执行某些操作时不使用它(side effects)。

  

您不应将纯特征用于计算的observable,以便在其依赖项发生更改时执行操作。

您可以使用常规计算机。

self.triggerAddressVerify = ko.computed(function () {
    console.log('here');
    self.cAddr1(); self.cAddr2(); self.cCity(); self.cState(); self.cZip();
    self.AddressActions.VerifyAddress(self);
});

但请注意,这将在最初以及未来的更改中运行一次。如果您只想对未来的更改执行操作,那么订阅纯计算的方法会更好。