2015-02-23 27 views
4

我有一個非常簡單的情況,在KnockoutJS 3中使用多選select元素。如果您將selectedOptions與具有IE(任意版本)的多選元素綁定在一起,select元素總是彈回到底部當選擇一個新選項時,最選擇的元素。我見過很多與此有關的文章,而且非常過時,但沒有明確的解決方案。任何幫助讚賞。KnockoutJS:Internet Explorer中的多重選擇問題

簡單例子這裏:

http://jsfiddle.net/unp9j9dc/1

重現通過點擊項目1,保持控制,點擊項目20,然後回到項2. UI將反彈到項目20

在另外,我應該提到,雖然JSFiddle使用的是knockout 3.0.0,但我在本地使用3.2.0,結果相同。我很快就會嘗試3.3.0。

UPDATE:與Knockout 3.3.0相同的結果也是如此。

+1

同樣的問題(http://knockoutjs.com/examples/betterList.html)也。 – 2015-02-23 21:20:49

+0

[可能有關的錯誤報告](https://github.com/knockout/knockout/issues/1354)。如果我從您的示例中刪除'selectedOptions'綁定,問題就會消失。 – 2015-02-23 21:22:23

+0

謝謝@JamesThorpe。是的,你也可以使selectedOptions成爲一個不可觀察的數組,這使得它基本上是單向綁定的(從UI到模型)。儘管如此,這種奪取了淘汰賽的威力。我可能會沿着這條路走下去,但它確實會讓事情變得混亂。 – 2015-02-23 21:26:13

回答

3

我明白了。我正在使用訂閱和雙向綁定相當廣泛,所有這些似乎仍然正常工作。

基本上,KO基礎結構只是通過界面進行操作,並將用戶界面與UI或模型更新中更新後的模型綁定進行同步。因此,它在UI更新上設置每個選項'selected屬性,並且當它「重新選擇」最後一個時,IE決定將其滾動到視圖中。

我把Knockout 3.2.0的調試版本和編輯過的305-310行都試圖更新選項的selected屬性,如果它已經等於任何設置。我計劃在我得到時間時提交這個請求,但是如果有其他人遇到這個問題,就是在這裏。

UPDATE:再次感謝 ,以@JamesThorpe,在[官方示例]存在here is the source I edited.

 setOptionNodeSelectionState: function (optionNode, isSelected) { 
      // IE6 sometimes throws "unknown error" if you try to write to .selected directly, whereas Firefox struggles with setAttribute. Pick one based on browser. 
      if (ieVersion < 7) 
       optionNode.setAttribute("selected", isSelected); 
      else if (optionNode.selected != isSelected) 
       optionNode.selected = isSelected; 
     }, 
+0

要完成這個答案,你可以鏈接到[編輯源代碼](https://github.com/knockout/knockout/blob/1e5e890faeca763021cf19e22c3f953a2e74fb86/src/utils.js#L286-L292),所以它是容易比較什麼被改變了? – 2015-02-24 14:02:44

+1

修復中存在拼寫錯誤(至少如您在此處所述) - 它應該是'optionNode.selected = isSelected' – 2015-02-24 14:10:12

+1

再次感謝@JamesThorpe,我更新了包含所有內容的答案。 – 2015-02-24 15:21:02