Дайджест уже выполняется, когда дочерний компонент уничтожен - PullRequest
0 голосов
/ 01 марта 2019

У меня странная проблема в приложении AngularJS.Ошибка является классической $digest already in process ошибкой.Я гуглил и смотрел на похожие вопросы, но ни одно из предложенных решений не сработало.Ошибка происходит в дочернем компоненте.Дочерний компонент - это просто оболочка для обычного ввода текста с некоторыми стилями.ng-model дочернего компонента связан с item, передаваемым в качестве ввода.События дочернего компонента, когда входные данные focused и blurred.Иерархия компонентов выглядит следующим образом: родительский компонент, который является модальным, дочерний компонент является текстовым вводом.Родительский компонент (модальный) может быть закрыт с помощью клавиши 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>

Вот дочерний компонент JS

.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});
                }
            }
        }
    })

Я изменил шаблон дочернего компонента до ng-model, на самом деле есть также привязки ng-blur и ng-focus, но я удалил их, чтобы развернутьисточник.

Вот как родительский шаблон использует дочерний шаблон

<rfid-input on-blur="fulfill(item)" focus="currentFocusedScanIndex"
            on-focus="onScanFocus(index)" item="item" id="$index">
</rfid-input>

Теперь, что чрезвычайно интересно, это то, что ошибка возникает только тогда, когда я нажимаю на вход, а затем закрываю модальное окно.Ошибка не произойдет, если я открою модальное и закрою его снова без выбора входа ...

Я в растерянности и не знаю, как заставить это работать.Я также попробовал решения $timeout, чтобы запустить onFocus и onBlur после тайм-аута $, чтобы не мешать текущему циклу $ digest.

Любая помощь или предложения, как решить эту проблему, будет принята с благодарностью.Если есть также несколько советов о том, как изменить этот дочерний компонент, это тоже было бы здорово.

1 Ответ

0 голосов
/ 01 марта 2019

Из документов:

Диагностика этой ошибки

Когда вы получаете эту ошибку, диагностировать причину проблемы может быть довольно сложно.Лучший способ действий - исследовать трассировку стека от ошибки.Вам нужно найти места, где были вызваны $apply или $digest, и найти контекст, в котором это произошло.

Должно быть два вызова:

Первый вызов - это хороший$ apply / $ digest и обычно вызывается каким-либо событием в верхней части стека вызовов.

Второй вызов - это плохой $apply / $digest, и это тот, который нужно исследовать.

После того, как вы определили этот вызов, вы идете вверх по стеку, чтобы увидеть, в чем проблема.

Если второй код был выполнен в коде вашего приложения, то вам следует выяснить, почему этот код былвызывается из $apply / $digest.Это может быть простой недосмотр или, возможно, он соответствует сценарию синхронизации / асинхронности, описанному ранее.

Если второй вызов был сделан внутри директивы AngularJS, то, вероятно, он соответствует второму сценарию программного запуска события, описанному ранее.,В этом случае вам может понадобиться поискать дерево, которое вызвало событие в первую очередь

Для получения дополнительной информации см. Справочник по AngularJS Error - inprog - Диагностика этой ошибки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...