无容器控制流语法 - IE8无法正确呈现模板

时间:2012-08-31 20:51:22

标签: knockout.js

当使用无容器语法并调用Knockoutjs模板时,IE8无法正确呈现foreach控制流中的模板。初始化工作正常,但如果更改items,则渲染错误。这种情况只发生在IE8上,9可以,甚至7个工作。

型号

function BrowseModel() {
    var self = this;
    self.items = ko.observableArray();
    self.itemsStep = ko.observable(1);
    self.repopulate = function() {
        self.itemsStep(self.itemsStep() + 3);
        return false;
    };
    ko.computed(function() {
        var arr = [];
        for (var i = self.itemsStep(); i <= self.itemsStep() + 5; i++) {
            arr.push(i);
        }
        self.items(arr);
    }, self);
}

ko.applyBindings(new BrowseModel());

查看

<a href="javascript:;" data-bind="click: repopulate">Change items</a>
<ul>
    <!-- ko foreach: items -->                                                 
        <!-- ko template: { name: 'product_template'} -->
        <!-- /ko -->  
   <!-- /ko -->
</ul>

<ul>
    <li data-bind="template: { foreach: items, name: 'product_template' }"></li>
</ul>


<br />
<div data-bind="text: ko.toJSON($data)"></div>


<script type="text/html" id="product_template">
    <li data-bind="text: $data"></li>
</script>    

我没有找到IE 8的行为模式。渲染是随机的。

除了不使用无容器控制流语法外,我该如何解决这个问题?

Fiddle

LE:如果这很重要,我正在使用F12开发人员工具

2 个答案:

答案 0 :(得分:5)

Fixed jsFiddle

我在内部绑定中添加了&nbsp;,它似乎解决了问题。似乎IE8中的淘汰赛不喜欢没有内容的嵌套无容器控件绑定。

请注意,根据我的经验,无容器控件绑定往往会在IE6-IE8中显示出不稳定的行为。如果您打算支持这些浏览器,我建议您避免使用无容器控件绑定。几乎所有涉及无容器控件绑定的场景都可以使用带有数据绑定表达式的HTML元素重写为替代方案。

答案 1 :(得分:0)

我在IE8中对这个结构很幸运。当我在原帖中显示时,当我试图将无容器的东西分开时,IE8抱怨道。通过使用下面显示的语法,它可以正常工作。

<table id="mam-listing-table" border="0" width="100%" cellpadding="2" cellspacing="0">
    <thead>
        <tr valign="top">
            <th class="ms-vh" nowrap="">Team</th>
            <th class="ms-vh" nowrap="" colspan="99">Note Count</th>
        </tr>
        <tr valign="top">
            <th class="ms-vh" nowrap=""></th>

            <!-- ko foreach: Months -->
                <th class="ms-vh" nowrap="" data-bind="text: $data "></th>
            <!-- /ko -->

            <th class="ms-vh" nowrap="" data-bind="text: 'TOTAL as of ' + moment().format('MM/DD/YY')"></th>
        </tr>
    </thead>

    <tbody>

        <!-- ko template: { name: 'Site', foreach: Sites} -->
        <!-- /ko -->  
        <!-- ko template: { name: 'Total'} -->
        <!-- /ko -->  

    </tbody>

</table>