2013-09-23 21 views
1

我有一个观察的名为foo,然后计算该互联,富KnockoutJS - jQuery Mobile的范围栏没有更新

foo = ko.observable(); 
bar = ko.computed(function(){ 
    read: function() { 
     var blah = parseFloat(self.foo()), 
      qux = blah + 1; 

     return qux; 
    }, 
    write: function(value) 
    { 
     value = parseFloat(value); 
     self.foo(value - 1); 
    }, 
}); 

我有这个文本框

<input type="text" name="foo" id="foo" placeholder="Foo" class="border-bottom" data-bind="value: foo"/> 

而且我有这个jQuery Mobile的Range Slider

<input class="ratio" type="range" name="slider-percent" min="0.00" max="100.00" data-highlight="true" step="0.1" data-bind="value: bar"/> 

然后调用标记为KO

<pre data-bind="text: ko.toJSON($data, null, 2)"></pre> 

这里有一些问题,我有

  1. 当我更新foo文本框,我看到的通过调试标记bar变化值,但它并没有在实际的滑块反映。
  2. 当我尝试移动滑块时,没有任何反应。 foobar均未更新。

有没有办法解决这个问题?

回答

0

这里的工作小提琴:http://jsfiddle.net/r7Ruc/1/

有一个额外的功能()在计算申报。如果你同时使用读和写,你应该传递一个对象来计算,而不是一个函数。

该代码由于“链接到jsfiddle.net必须附带代码”。

var CTR = function() { 
    var self = this; 
    self.foo = ko.observable(); 
    self.bar = ko.computed({ 
     read: function() { 
      var blah = parseFloat(self.foo()), 
       qux = blah + 1; 

      return qux; 
     }, 
     write: function (value) { 
      console.log(value); 
      value = parseFloat(value); 
      //self.share(value - 1); 
     }, 
    }); 
} 
var c = new CTR(); 
ko.applyBindings(c); 
+0

感谢您的回复pax162。我测试了jsfiddle。在我看来,当我移动滑块时,它仍然不会更新'foo'可观察值。我用这两个变量的目标是,如果一个变化,另一个变化。当'foo'改变时你的代码更新,当我移动滑块时''foo'不会更新。 – arvinsim

+0

我改变了'self.share(value-1)',因为它应该是'self.foo(value-1)'。我不确定你为什么评论它。我取消了评论,然后它在jsfiddle中运行良好。 – arvinsim

+0

好,现在可以运作了吗? – pax162