2

我有一个在Internet Explorer和Chrome中测试过的错误,并且这只发生在Internet Explorer中。在Internet Explorer 11中给出错误绑定上下文的敲除组件

我使用的是Knockout-3.3.0Knockout Validation

我有一个使用类似下面的自定义元件的敲除组分:

<div> 

    ... 

    <div data-bind="with: editableUser"> 
     <div data-bind="visible: !$parent.editMode"> 
      <user-picker params="value: $parent.user, multiple:false, hideSelection:true"></user-picker> 
     </div> 
    </div> 

    ... 

</div> 

定制元件是如上所示我的视图模型的一部分的其它节点的后代。

的脚本页面依赖关系和视图模型绑定被应用,如下所示:

<script src="/Scripts/knockout-3.3.0.debug.js"></script> 
<script src="/Scripts/knockout.validation.js"></script> 
<script src="/Scripts/CustomBindings.js"></script> 

<script> 
    $(function() { 
     ko.validation.init({ 
      insertMessages: false, 
      decorateInputElement: false, 
      errorElementClass: "has-error has-feedback", 
      decorateElementOnModified: true 
     }); 
    }); 
</script> 

<script src="/Scripts/UserPicker.js"></script> 
<script src="/Scripts/UserModel.js"></script> 
<script src="/Scripts/CustomComponents.js"></script> 
<script type="text/javascript"> 
    var userModel; 
    $(function() { 
     var userRepository = new MyModule.UserRepository(); 
     userModel = new MyModule.UserModel(userRepository); 
     ko.applyBindings(userModel); 
    }); 
</script> 

在脚本之前的MVC部分呈现组件的模板;如下所示:

<template id="user-picker-template"> 
    <div class="user-picker"> ... </div> 
</template> 

该组件在CustomComponents.js中注册,如图所示。

ko.components.register('user-picker', { 
    template: { element: 'user-picker-template' }, 
    viewModel: MyModule.UserPicker 
}); 

我也有CustomBindings.js文件中的自定义挖空绑定。

当调试敲除在此函数applyBindingsToNodeInternal发生在这条线的错误:ko.applyBindings呼叫期间抛出

var initResult = handlerInitFn(node, getValueAccessor(bindingKey), allBindings, bindingContext['$data'], bindingContext); 

JavaScript错误。

的错误是在user-picker-template内侧的第一结合属性未定义,这是因为所使用的bindingContext不正确,userModel被传递,而不是UserPicker

由于错误,其余与非组件相关的绑定完成,然后user-picker绑定之后正确完成,但由于javascript错误,我的点击事件上的一些回调代码不起作用。

在Chrome中对此进行调试时,用户选取器的绑定将被忽略,直到userModel被绑定。

有谁知道什么可能会导致此错误?

回答

3

这是因为模板被绑定在组件外部,直接在<template>元素内。敲除并不具体跳过<template>元素,但browsers that support <template>报告内容与正常元素不同。

解决这个问题的最简单的方法是不使用<template>,而使用<script>

<script type="text/html" id="user-picker-template"> 
    <div class="user-picker"> ... </div> 
</script> 
+0

这固定它,谢谢。我在回调不起作用时遇到的问题实际上最终是由于IE缓存了一个json获取请求,但这种更改至少有助于摆脱任何javascript错误。 – Pricey 2015-04-02 08:30:21