Javascript 销毁子组件时已在进行摘要
我在AngularJS应用程序中遇到了一个奇怪的问题。该错误是经典的Javascript 销毁子组件时已在进行摘要,javascript,angularjs,frontend,Javascript,Angularjs,Frontend,我在AngularJS应用程序中遇到了一个奇怪的问题。该错误是经典的$摘要已在处理中错误。我曾在谷歌上搜索并研究过类似的问题,但提出的解决方案都不奏效。 错误发生在子组件中。子组件基本上只是带有一些样式的常规文本输入的包装器。子组件的ng模型绑定到作为输入传递的项。当输入被聚焦和模糊时,子组件输出事件。 组件层次结构如下:父组件是模态,子组件是文本输入。可以通过ESC键关闭父组件(模态)。如果我打开模式,选择输入(不要在其中键入任何内容),然后通过ESC键将其关闭,则会出现错误 下面是子组件模板
$摘要已在处理中
错误。我曾在谷歌上搜索并研究过类似的问题,但提出的解决方案都不奏效。
错误发生在子组件中。子组件基本上只是带有一些样式的常规文本输入的包装器。子组件的ng模型
绑定到作为输入传递的项
。当输入被聚焦和模糊时,子组件输出事件。
组件层次结构如下:父组件是模态,子组件是文本输入。可以通过ESC键关闭父组件(模态)。如果我打开模式,选择输入(不要在其中键入任何内容),然后通过ESC键将其关闭,则会出现错误
下面是子组件模板
<div class="input-group has-feedback"'
ng-class="{'has-error' : vm.item.errors.length > 0 ,
'has-success' : vm.item.isFulfilled}">
<div class="input-group-addon">
<i class="fa fa-asterisk"></i>
</div>
<input
ng-model="vm.item.pendingBarcode"
type="text"/>
</div>
现在非常有趣的是,只有当我点击输入然后关闭模式时,错误才会发生。如果我在没有选择输入的情况下打开模式并再次关闭它,则不会发生错误
我不知所措,不知道如何使它工作。我尝试了$timeout
解决方案,并在$timeout之后启动onFocus
和onBlur
,以避免干扰当前的$digest循环
对于如何解决此问题的任何帮助或建议,我们将不胜感激。如果还有一些关于如何更改子组件的建议,那也太好了 从文档中:
诊断此错误
当您遇到此错误时,诊断问题的原因可能会让人望而生畏。最好的做法是从错误中调查堆栈跟踪。您需要查找调用了$apply
或$digest
的位置,并找到发生这种情况的上下文
应该有两个电话:
第一个调用是良好的$apply/$digest,通常由调用堆栈顶部附近的某个事件触发
第二个调用是错误的$apply
/$digest
,这是要调查的调用
一旦您识别了这个调用,您就可以逐步了解问题所在
如果第二次调用是在您的应用程序代码中进行的,那么您应该了解从$apply
/$digest
中调用此代码的原因。这可能是一个简单的疏忽,也可能与前面描述的同步/异步场景相符
如果第二个调用是在AngularJS指令内进行的,那么它很可能与前面描述的第二个编程事件触发器场景相匹配。在这种情况下,您可能需要进一步查找树,以了解是什么首先触发了事件
有关详细信息,请参阅。请参阅。我不知道为什么要检查表达式绑定是否为函数。在表达式(
&
)绑定的情况下,$compile服务始终绑定一个作用域。$eval
函数,该函数在属性不存在的情况下执行该属性上的表达式。@georgeawg感谢您的提示。我不知道。无论如何,我更接近问题的起因。父组件位于angular ui引导$uibModal实例中,该实例提供了ESC单击关闭功能。我发现当我修改catch
中的$scope时抛出了错误,当我单击ESC关闭模式时触发了该错误。在catch中,我经常通过调用我们的API来刷新数据。现在我可以通过在$timeout中包装刷新来修复错误。。。比如catch(()=>$timeout(()=>refresh())代码>看起来很难看,但我想这就是干扰的原因
.component('rfidInput', {
templateUrl:
'swipeables/templates/swipeables.rfidReader.tpl.html',
controllerAs: 'vm',
bindings: {
item: '<',
id: '<',
onFocus: '&',
onBlur: '&',
focus: '<'
},
controller: function() {
this.onInputFocus = function() {
if(typeof this.onFocus === 'function') {
this.onFocus({index:this.id})
}
}
this.onInputBlur = function() {
if(typeof this.onBlur === 'function') {
this.onBlur({item:this.item});
}
}
}
})
<rfid-input on-blur="fulfill(item)" focus="currentFocusedScanIndex"
on-focus="onScanFocus(index)" item="item" id="$index">
</rfid-input>