2013-04-23 59 views
0

我有点困惑与敲除可见绑定。 我创建了一个示例来演示问题。 主要目标是当用户选择“其他”选项时显示一些div(otherDetails)。 这不起作用。 当“mySelection”字段发生变化时,可见性未得到重新评估。敲除可见绑定没有得到重新评估

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="width=device-width" /> 
    <title>Test</title> 

    <script src="Scripts/jquery-1.8.2.min.js" type="text/javascript"></script> 
    <script src="Scripts/knockout-2.2.0.js" type="text/javascript"></script> 

    <script type="text/javascript"> 

    function data() 
    { 
      this.mySelection = ko.observable('other'); 

      this.isOtherSelected = ko.computed(function() 
      { 
        return this.mySelection.peek() == 'other'; 
      }, this); 
    } 

    var myData = new data(); 

    $(document).ready(function() 
    { 
      $('#selections').change(function() 
      { 
       myData.mySelection = $(this).val();   
      }); 

      dataBind(); 
    }); 

    function dataBind() 
    { 
      ko.applyBindings(myData); 
    } 
    </script> 
</head> 

<body> 
     <div> 
       <select id="selections" data-bind="value: mySelection"> 
        <option value='one'>One</option> 
        <option value='two'>Two</option> 
        <option value='three'>Three</option> 
        <option value='other'>Other</option> 
       </select> 
     </div> 
     <div id="otherDetails" data-bind="visible: isOtherSelected"> 
      <span>Some controls and stuff...</span> 
     </div> 
</body> 

在此先感谢Yaron。

回答

0

只是删除peek()
return this.mySelection() == 'other';

窥视功能获得的观察到的价值,但不认同外上的变化来计算观察到。因此,您的绑定不会被重新评估。

0

你应该以不同的方式使用observables。每个观察到的是一个函数,以便获得价值,你必须把它叫做:

return this.mySelection() == 'other'; 

如果你想将值分配给它,你应该传递价值这一功能:

myData.mySelection($(this).val()); 

这里是工作提琴: http://jsfiddle.net/kkGRs/

PS您不需要在那里使用jQuery更改处理程序。 KO会自动更新观察值的值。这里是重构代码:http://jsfiddle.net/kkGRs/1/

+0

非常感谢! 我错过了它的文档... – user2310367 2013-04-23 08:41:39