2014-09-23 67 views
0

我有内部的主要功能和子功能,如:如何在viewmodel的内部函数中访问外部函数observable?

var main= function() { 
    var self = this; 
    self.value1 = ko.observable(""); 
    var data = self.value1(); 
    self.revaluate = ko.computed(function(){ 
    data = self.self.value1(); // i am overwriting 
    }); 

    function inner(i1,i2) 
    { 
     var self= this ; 

     self.id1=ko.observable(i1); 
     self.id2=ko.observable(i2); 
     self.value2 = ko.observable(""); 

     self.visibility = ko.computed(function() { 
      if (data == 1) {return true;} 
      else {false;} 
     }); 
    } 
} 

ko.applyBindings(new main()); 

我需要inner函数内value1值应该是动态的。

我试图将它存储在一个变量中并访问它,但它不会解决我的情况,因为有一种情况,其中self.visibility根本不会触发并动态更新。

Onload我得到一个更新的value1所以一切都会工作,但我有一个按钮“goto next stage”,并点击该按钮我正在更新状态,即self.value1(2)。此时self.visibility应该更新,因为value1有变化。

我试图通过一个简单的例子来展示我需要的东西,但实际上有一些更复杂的循环正在进行。

任何线索都会很棒。

回答

0

为了您的计算机更新时self.value1更新你确实有使用它计算的函数内部

self.visibility = ko.computed(function(){ 
     if(self.value1() == 1) 
      {return true;} 
     else 
      { return false;} 
     }); 
     } 

最主要的原因,你的计算,是因为你使用数据到没有工作计算出这是一个简单的JS变量,这就是为什么它只更新onload,数据从来没有真正重新评估,所以你的计算从未得到更新。你需要使用的是一个ko.observable计算为正确更新!

另外一个注意:我没有看到你在计算中使用了内部函数的任何变量。如果真是这样,那么你可以简单地将计算结果传送给main函数。

编辑:由于我没有工作代码,不知道你如何使用这个内部函数,我不能创建一个工作示例只是指出问题。 self.value1将有范围问题,但你应该能够克服这一点,尝试将其作为变量传递,使用全局变量......无论哪个适用于你

+0

不要忘记执行'value1',因为它是一个可观察的。另外,从你复制的问题来看问题:'else'位不返回任何东西,它只是“执行”false作为语句(并且函数将最终返回'undefined',这是伪造的,所以它可能没有被真正注意到)。 – Jeroen 2014-09-23 13:02:11

+0

检查我的编辑。 '数据从来没有真正重新评估'现在它会但仍然是同样的问题,我不能让我的内部函数在运行中更新'数据'。 – 2014-09-23 13:05:15

+0

'你在代码中提到的'icepick''如果(self.value1 == 1'不会工作,它会因为范围问题给出未定义的代码 – 2014-09-23 13:06:53

相关问题