2012-02-06 34 views
0

我有以下代碼:如何通過輸入或從其他輸入計算來設置計算的觀測值?

function ViewModel() { 
     var self = this; 
     self.deckareax = ko.observable(0); 
     self.deckareay = ko.observable(0); 
     self.calculatedarea = ko.observable(20); 
     self.deckareax.subscribe(function() { 
      if (self.deckareax() == 0 || deckareay == 0) { 
       self.calculatedarea(0); 
      } else { 
       self.calculatedarea(self.deckareax() * self.deckareay()); 
      } 
     } 
     ); 
     self.deckareay.subscribe(function() { 
      console.log("deckareay " + self.deckareay()) 

      if (self.deckareax() == 0 || self.deckareay() == 0) { 
       self.calculatedarea(0); 
      } else { 
       self.calculatedarea(self.deckareax() * self.deckareay()); 
      } 

     } 
     ); 
     self.deckareamxm = ko.computed({ 
      read: function() { 
       return self.calculatedarea(); 
      }, 
      write: function (value) { 
       self.calculatedarea(value); 
       if ((self.deckareax() * self.deckareay(0)) != value) { 
        self.deckareax(0); 
        self.deckareay(0); 
       } 

      }, 
       owner:self 
     }); 
    } 

    ; 

    ko.applyBindings(new ViewModel()); 

我希望能夠通過手動輸入或進入deckareax * deckareay calcualting設置總面積(deckareamxm)。如果輸入結果並且(deckareax * deckareay)不等於總的甲板面積x並且y應該被清除。

但是,如果我輸入總面積清除兩者,但也清除自己,這非常有效。如果我再次輸入它保留的總面積。我認爲它可能會變得複雜。有任何想法嗎?

+0

這行中的'0'只是一個錯字:'(self.deckareax()* self.deckareay(0)!= value)'? – 2012-02-06 22:21:30

+0

是的。以及我的實際代碼中的錯誤! – GraemeMiller 2012-02-06 22:48:19

回答

1

This jsfiddle似乎做你想做的。還有一些其他的錯誤,但我主要通過將self.calculatedarea(value);移到寫入函數的底部來解決問題。

+0

謝謝。我無法發現它們。我認爲我的思想與Knockoutjs有點空白。我是否在製作這個過於複雜的BTW?有更簡單的方法來實現這一目標嗎? – GraemeMiller 2012-02-06 22:49:06