2012-02-02 106 views
4

我使用knockoutjs 2.0 我一直想在IE8這個表工作淘汰賽IE8的問題(它工作正常,在FF,Chrome和IE9):用foreach數據綁定和輸入值數據綁定

<table data-bind="foreach: Applications"> 
    <tr> 
     <td><input type="text" data-bind="value: Name"/></td> 
    </tr> 
</table> 

在IE8我得到的錯誤: 錯誤:「未定義」爲空或不是對象 網址:http://127.0.0.1:81/Scripts/jquery-1.5.1.min.js

我其實是通過使表TBODY與模板,使模板解決了該問題包含錶行。但這不是那麼幹淨,我想知道是否有更好的解決方案。

下面是我如何設置視圖模型:

self.Applications = ko.observableArray([]); 

$.each(model.Applications, function (i, applicationItem) { 
    var application = new Application(applicationItem.ApplicationID, applicationItem.Name); 
    self.Applications.push(application); 
}); 

function Application(applicationID, name) { 
    var self = this; 
    self.ApplicationID = applicationID 
    self.Name = ko.observable(name); 
}; 

編輯:找到一個解決方案 使用無容器控制流,而不是

<table> 
    <tbody> 
    <!-- ko foreach: Applications --> 
    <tr> 
     <td><input type="text" data-bind="value: Name"/></td> 
    </tr> 
    <!-- /ko --> 
    </tbody> 
</table> 
+0

我認爲問題在於瀏覽器強制'tbody'進入DOM,因爲它有一個可選的元素,但假設你只是在你的表裏面使用'tr',就會在那裏,見這裏:http://www.w3。 org/TR/html5/syntax.html#optional-tags – 2012-02-02 23:34:06

回答

6

您的修復工作正常,如果你想要一個更簡潔的選擇,你可以簡單地把數據綁定的「TBODY」節點上:

<table> 
    <tbody data-bind="foreach: Applications"> 
     <tr> 
      <td><input type="text" data-bind="value: Name"/></td> 
     </tr> 
    </tbody> 
</table> 

的問題是,IE8會自動添加一個「TBODY」來DOM(即使不存在於標記中)。因此,如果數據綁定屬性是「表」節點上,當淘汰賽執行的foreach,新的兒童被添加到「表」,而不是「TBODY」,獲得這樣的:

<table data-bind="foreach: Applications"> 
    <tr> 
     <td><input type="text" value="John"/></td> 
    </tr> 
    <tbody> 
    </tbody> 
</table> 

而且IE對此並不滿意。這就是爲什麼,正如你已經發現的那樣,僅使用「無容器」符號是不夠的,你需要「tbody」節點。請注意,其他瀏覽器在處理此問題時沒有問題。 這是使用knockoutjs時「必須知道」的技巧之一。

希望這有助於保證正在發生的事情。

0

我要說的是,你應該使用$數據。名稱而不是名稱。 否則,knockout期望名稱在您的ViewModel/$ root上可用。

+0

在使用此方法的IE8中仍然會出現相同的錯誤。 – 2012-02-02 19:43:19

+0

嗨,我創建了這個jsfiddle [http://jsfiddle.net/jBb8G/4/](http://jsfiddle.net/jBb8G/4/),並運行它在我的IE9運行IE8 browsermodus沒有問題。我必須承認,這不是一個很好的測試。你可以讓我知道如果問題仍然發生在你​​的IE8? – 2012-02-02 20:48:29