获取输入绑定的未捕获错误“NO_MODIFICATION_ALLOWED_ERR”

Getting an uncaught error "NO_MODIFICATION_ALLOWED_ERR" for input binding

提问人:Zachary Scott 提问时间:7/13/2011 最后编辑:JeroenZachary Scott 更新时间:2/23/2014 访问量:6450

问:

我从这个开始:

<script src="/Scripts/jquery-1.6.2.min.js" ...
<script src="/Scripts/knockout-1.2.1.debug.js" ...
<script src="/Scripts/knockout.mapping-latest.js" ...
<script src="/Scripts/jquery.unobtrusive-knockout.min.js" ...

然后,我从服务器中提取一个平面 JSON 对象,并将找到的每个属性绑定到 DOM 中的匹配元素:

$.ajax({
    url: '/GetRecord',
    type: 'POST',
    dataType: 'json',
    data: JSON.stringify(requestObject),
    contentType: 'application/json; charset=utf-8',
    success: function (data) {
        // Clear the current view model
        VM.Items.length = 0;

        // only one item coming from server
        VM.Items[0] = ko.mapping.fromJS(data.BlankItem);

        // for each property found, bind it to the matching DOM element
        $.each(VM.Items[0], function (indexInArray, valueOfElement) {
            var attrName = indexInArray;

            // skip over things not an accessor (get/set property function)
            if( typeof valueOfElement == "function")
            {
                var attrValue = valueOfElement();

                // if it's a checkbox, bind the checked attribute
                var a = $('input[name="' + attrName + '"][type="checkbox"]');
                if (a.length)
                    a.dataBind({ checked: attrName });

                // if it's a radio, bind all the found radio checked attributes
                var b = $('input[name^="' + attrName + '"][type="radio"]');
                if (b.length)
                    b.dataBind({ checked: attrName });

                // if it's a text, bind the text attribute
                var c = $('input[name="' + attrName + '"][type="text"]');
                if (c.length)
                    c.dataBind({ text: attrName });  // <--- Error (use value)
            }
        });

        // Then set knockout loose
        ko.applyBindings( VM.Items[0] );
    }
});

这会导致错误:

未捕获的错误:NO_MODIFICATION_ALLOWED_ERR:DOM 异常 7 ko.bindingHandlers.updateknockout-1.2.1.debug.js:1577
invokeBindingHandlerknockout-1.2.1.debug.js:1231

ko.applyBindingsToNode.ko.dependentObservable。
disposeWhenNodeIsRemovedknockout-1.2.1.debug.js:1268
evaluateknockout-1.2.1.debug.js:927 ko.dependentObservableknockout-1.2.1.debug.js:965 ko.applyBindingsToNodeknockout-1.2.1.debug.js:1252 ko.applyBindingsknockout-1.2.1.debug.js:1284 ko.utils.arrayForEachknockout-1.2.1.debug.js:48




ko.applyBindingsknockout-1.2.1.debug.js:1283
$.ajax.successPropertyForm:266
f.extend._Deferred.e.resolveWithjquery-1.6.2.min.js:16
wjquery-1.6.2.min.js:18
f.support.ajax.f.ajaxTransport.send.d

我不认为它绑定了任何不应该绑定的项目。此外,html 中没有声明性敲除绑定。我做错了什么?

jQuery unobtrusive-JavaScript 敲除 .js 数据映射

评论


答:

119赞 Zachary Scott 7/14/2011 #1

我的天啊。答案是使用正确的绑定属性。而不是 ,而是用于输入!textvalue

评论

1赞 Allen Rice 6/26/2012
呵呵,看来这很常见。帮了我,谢谢!
0赞 ethermal 10/24/2012
我只是想补充一点,我在 chrome 中看到了这个错误,但在 IE 9 中没有抛出错误。我正在使用 IE9 进行测试/调试,并注意到一切正常,但是当您编辑输入字段中的值时,它没有更新基础数据。当然,如果绑定到文本而不是值,它怎么能正确更新。
0赞 TimothyP 12/18/2012
刚刚救了我,thnx!
0赞 MojoFilter 4/13/2013
哎呀,把我加到名单里。谢谢。
0赞 Homer 7/27/2012 #2

当我不小心多次调用时,我也在 Chrome 中看到了这个错误。ko.applyBindings(viewModel)

1赞 Patrice Calvé 10/2/2012 #3

就我而言,问题是我数据绑定到文本而不是值。

错误: <input type=“text” data-bind=“text:id” maxlength=“3” style=“width:100%;” />

good: <input type=“text” data-bind=“value:id” maxlength=“3” style=“width:100%;” />