Отменить регистрацию события в AngularJS - PullRequest
0 голосов
/ 30 сентября 2019

Имея контроллер, MyCtrl:

class MyCtrl {
    constructor($scope, $rootScope, ...) {
        this.$scope = $scope;
        this.$rootScope = $rootScope;
        this.doThis = _debounce(this.resize.bind(this), 300);
        ...
    }
    $onInit() { ... }
    $onDestroy() { ... }
}

Внутри $onInit называется $rootScope.$on. Как и этот, другой контроллер выполняет те же операции, но для страницы другого типа, скажем, MyCtrl2. Когда я иду ко второму от первого, первого продолжают вызывать, потому что он не уничтожен. Я решил эту проблему, используя метод, описанный Предотвратить $ rootScope. $ On от вызова функции несколько раз путем добавления отмены регистрации. $onInit сейчас:

$onInit() {
    this.$rootScope.$on('toggleNav', () => {
        this.doThis();
    });
    this.deregisterDoThis = this.$rootScope.$on('listen', function() {
        this.$scope.doThis();
    });
    this.$rootScope.$on('$destroy', this.deregisterDoThis);
}

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

 Uncaught TypeError: Cannot read property 'getAttribute' of null
    at $.t.default [as attr] (vendor.dll.js?aca3f637cd46c07f3280:135)
    at attachNotes (VM133106 chart-util.js:1016)
    at invokeFunc (debounce.js?e59c:95)
    at trailingEdge (debounce.js?e59c:144)
    at timerExpired (debounce.js?e59c:132)

Есть идеи по этому поводу?

1 Ответ

2 голосов
/ 30 сентября 2019

$rootScope.$on('$destroy') никогда не вызывается, потому что $rootScope никогда не уничтожается.

$onInit() {
    this.deregisterToggleNav = this.$rootScope.$on('toggleNav', () => {
        this.doThis();
    });
    this.deregisterDoThis = this.$rootScope.$on('listen', ̶f̶u̶n̶c̶t̶i̶o̶n̶(̶)̶ () => {
        ̶t̶h̶i̶s̶.̶$̶s̶c̶o̶p̶e̶.̶d̶o̶T̶h̶i̶s̶(̶)̶;̶
        this.doThis();
    });
    ̶t̶h̶i̶s̶.̶$̶r̶o̶o̶t̶S̶c̶o̶p̶e̶.̶$̶o̶n̶(̶'̶$̶d̶e̶s̶t̶r̶o̶y̶'̶,̶ ̶t̶h̶i̶s̶.̶d̶e̶r̶e̶g̶i̶s̶t̶e̶r̶D̶o̶T̶h̶i̶s̶)̶;̶
}

Вместо этого используйте $onDestroy Крюк жизненного цикла:

$onDestroy() {
    this.deregisterToggleNav();
    this.deregisterDoThis();
}

Для получения дополнительной информации,см.

...