2014-02-07 83 views
0

我想設置將依賴於其他兩個變量後計算的,但我不希望這樣的計算 變量對這些增值經銷商之一的初始化反應。如何使變量初始化其

var viewModel = function() { 
    var self = this; 
    self.first = ko.observable(""); 
    self.second = ko.observable(); 

    self.doSmth = function() { 
     self.second(self.second() + 1); 
    }; 

    self.init = function(o){ 
     self.second(o); 
    }; 

    self.comp = ko.computed(function(){ 
     self.first(); 
     self.second(); 
     alert(self.second()); 
    }); 
}; 
var vm = new viewModel(); 
ko.applyBindings(vm); 
vm.init(111); 

http://jsfiddle.net/TCAHS/1/

警報消息應該只出現在我上的按鈕和因變量值,單擊改變。並且沒有'undefined'和初始值'111'的消息。有沒有內置的解決方案?謝謝。

+3

您可以使用'{deferEvaluation:真正}您計算'選項,並在'doSmth'http明確要求://jsfiddle.net/bWLXh/。但是你的設計很奇怪:你不會在任何地方使用計算機本身,似乎你只是想利用自動迴歸的優勢......你能詳細說明你的使用案例並寫一點更多你想做什麼實現? – nemesv

+0

不錯的解決方案,但它需要調用計算方法明確每個地方。我想避免它。你說得對,我不需要計算價值本身。我只想在代碼中找到一個地方,我可以在那裏處理某些變量的變化(當然是兩個以上)。 –

+2

如果您不需要計算,那麼就不要在你的相關屬性,使用計算:)只是手動'subscribe',您可以在init做到這一點:http://jsfiddle.net/v2j2k/ – nemesv

回答

0

我會用最簡單的辦法去...怎麼樣設置標誌來檢查是否觀察到已經初始化,是這樣的:

var viewModel = function() { 
    var self = this; 
    self.first = ko.observable(""); 
    self.second = ko.observable(); 

    self.doSmth = function() { 
     self.second(self.second() + 1); 
    }; 

    self.init = function(o){ 
     self.second(o); 
    }; 

    var initialized = false; 

    self.comp = ko.computed(function(){ 
     self.first(); 
     self.second(); 

     if (initialized) { 
      alert(self.second()); 
     } 
     initialized = true; 
    }); 
}; 
var vm = new viewModel(); 
ko.applyBindings(vm); 
vm.init(111); 

而這裏的fiddle