2012-02-06 60 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