2014-09-23 98 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

相關問題