淘汰可观察的最新价值

时间:2013-12-23 15:52:54

标签: knockout.js

我想知道Knockout在哪里存储了可观察量的价值。例如,我有以下代码:

var field1 = ko.observable('a');
field1(); // prints 'a'
field1.peek(); // prints 'a'
field1._latestValue; //prints 'a'

field1._latestValuu = 'b';
field1._latestValue; //prints 'b'
field1(); // prints 'a'
field1.peek(); //prints 'a'

因此不确定Knockout存储价值的位置。我看到peek()的实现,它返回_latestValue。但是,即使在手动更改_latestValue之后,我仍然在调用peek()时得到旧值。

我希望在手动设置_latestValue之后,像field1()或field1.peek()这样的调用会返回新值。

我知道订阅者不会被调用,这可能有点棘手,因为_latestValue是一个内部变量,但这对我需要解决的问题很好。

编辑:我想这样做的原因是为计算的observable设置初始值。所以我希望能够修改它的_latestValue所以当我调用field()或field.peek()时,它返回我手动设置的值而不是计算的值。我将启用带标志的计算,如下所示:

var Object1 = function() {
    self.mode = ko.observable('read-only');
    self.calculated = ko.computed({
        read: function() {
           if (self.mode() == 'read-only') {
              if (self.calculated)
                  return self.calculated._latestValue;
           } else {
              // calculation goes here
           }
       },
       write: function(value) {
           self.calculated._latestValue = value;
       }
   });
};
var obj1 = new Object1();
obj1.calculated('a');
obj1.calculated(); // prints 'a'
obj1.mode('edit');
obj1.calculated(); // prints calculated value

1 个答案:

答案 0 :(得分:1)

有一个名为_latestValue的内部变量。在调试版本中,它作为._latestValue从observable中暴露出来。但是,直接设置不会影响内部_latestValue变量。

像:

var a = 1
this.a = a;

this.a = 2;

在此示例中,变量a仍为1;