2013-02-15 83 views
3

请参阅下面的简单示例;一个绑定到计算的observable的文本框。我的问题是IE在文本框更新时调用方法两次。 Firefox和其他浏览器似乎没有这个问题。我在IE 7 &中观察到这个问题8.knockout.js计算可观察性在Internet Explorer中调用两次

首先,我做错了什么?如果不是,那么建议的方法是什么?

<script> 
    var viewModel = { 
     myTestVar: "aaa" 
    }; 

    viewModel.myTest = ko.computed({ 
     read: function() { 
      return viewModel.myTestVar; 
     }, 
     write: function (value) { 
      alert(value); 
      viewModel.myTestVar = value; 
     }, 
     owner: viewModel 
    }); 

    $(document).ready(function() { 
     ko.applyBindings(viewModel); 
    }); 
</script> 
</head> 
<body> 
    <input data-bind="value:myTest",type="text" style="width:150px;" /> 
</body> 

回答

1

value绑定有一个特殊的部分用于处理Internet Explorer中的自动完成。这通常会导致两次写入。你可以关闭它,如果你不关心自动完成,通过添加属性到input

<input data-bind="value:myTest" type="text" style="width:150px;" autocomplete="off" /> 
+0

谢谢,这工作!写入方法现在只被调用一次。 – Per 2013-02-15 21:22:24

+0

这对IE 10标准文档模式下的IE 10没有帮助。我浏览了KO调试版本的代码,在'value'绑定检查中'element.autocomplete'是'undefined',导致注册了双重事件处理程序。你知道这是否有一个公开的问题,或者是否已经解决? – 2013-10-15 13:51:25

+0

它似乎是IE10兼容模式下的一个错误。我不知道有什么公开的问题。 – 2013-10-15 21:30:46

0

试试这个:

write: function (value) { 
    if(value != viewModel.myTestVar) { 
     alert(value); 
     viewModel.myTestVar = value; 
    } 
} 

由于viewModel.myTestVar不是可观察到的,我没有一个好主意,为什么写叫两次,但检查应防止实际多写。