knockoutjs attr绑定和IE7

时间:2012-02-01 14:13:11

标签: internet-explorer-7 knockout.js attr

此语法适用于FF

<input data-bind="checked: isRequest, attr: { name: 'id_' + id }" type="checkbox" />

但是在IE7中,name属性没有呈现?

修改 其他属性,如标题作品,奇怪,但我需要name属性,以便我可以发布数据:/

2 个答案:

答案 0 :(得分:4)

我遇到了一个类似的问题,尝试使用attr来解决问题:{'class':某事,'style':somethingElse}并放弃尝试让attr绑定在IE7中工作。

编写自定义绑定以手动应用jquery的工作是什么:

ko.bindingHandlers.customCss = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var css = ko.utils.unwrapObservable(valueAccessor());
        $(element).addClass(css);
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var css = ko.utils.unwrapObservable(valueAccessor());
       $(element).addClass(css);
    }
};

所以在你的情况下,我会尝试在ko.applyBindings()之前将以下内容添加到你的document.ready中:

ko.bindingHandlers.customName= {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var name= ko.utils.unwrapObservable(valueAccessor());
        $(element).attr('name', 'id_' + name);
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var name= ko.utils.unwrapObservable(valueAccessor());
        $(element).attr('name', 'id_' + name);
    }
};

然后将您的输入绑定为:

<input data-bind="checked: isRequest, customName: id }" type="checkbox" />

答案 1 :(得分:1)

我知道这已经过时但我找到了解决IE6 / 7问题的方法。通过查看最新淘汰源的'uniqueName'绑定来找到解决方案:

ko.bindingHandlers['uniqueName'] = {
    'init': function (element, valueAccessor) {
        if (valueAccessor()) {
            element.name = "ko_unique_" + (++ko.bindingHandlers['uniqueName'].currentIndex);

            // Workaround IE 6/7 issue
            // - https://github.com/SteveSanderson/knockout/issues/197
            // - http://www.matts411.com/post/setting_the_name_attribute_in_ie_dom/
            if (ko.utils.isIe6 || ko.utils.isIe7)
                element.mergeAttributes(document.createElement("<input name='" + element.name + "'/>"), false);
        }
    }
};

简单地利用相同的机制来合并属性,这与改变名称属性具有相同的效果,但是以IE6 \ 7友好的方式。