Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 销毁子组件时已在进行摘要_Javascript_Angularjs_Frontend - Fatal编程技术网

Javascript 销毁子组件时已在进行摘要

Javascript 销毁子组件时已在进行摘要,javascript,angularjs,frontend,Javascript,Angularjs,Frontend,我在AngularJS应用程序中遇到了一个奇怪的问题。该错误是经典的$摘要已在处理中错误。我曾在谷歌上搜索并研究过类似的问题,但提出的解决方案都不奏效。 错误发生在子组件中。子组件基本上只是带有一些样式的常规文本输入的包装器。子组件的ng模型绑定到作为输入传递的项。当输入被聚焦和模糊时,子组件输出事件。 组件层次结构如下:父组件是模态,子组件是文本输入。可以通过ESC键关闭父组件(模态)。如果我打开模式,选择输入(不要在其中键入任何内容),然后通过ESC键将其关闭,则会出现错误 下面是子组件模板

我在AngularJS应用程序中遇到了一个奇怪的问题。该错误是经典的
$摘要已在处理中
错误。我曾在谷歌上搜索并研究过类似的问题,但提出的解决方案都不奏效。 错误发生在子组件中。子组件基本上只是带有一些样式的常规文本输入的包装器。子组件的
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>