Почему событие перестает быть пойманным, когда «ng-switch» -ing

У меня есть директива загрузки файлов, которая запускает события (через область . $ Emit ), когда файл загружается, а затем попадает в мой контроллер (через область . $ On ). для обновления индикатора выполнения. Директива загрузки файла получает ng-switch -ed out, поэтому пользователь может заполнить другую информацию о файле во время загрузки файла. Я хочу, чтобы индикатор выполнения продолжал обновляться, пока они это делают. Все это отлично работает с версией 1.0.2, но теперь оно теперь сломано в 1.0.4.

The jsFiddle I created is greatly simplified, but it shows the problem. When the page first loads, the event is fired from the directive and it gets caught in the controller and everything gets updated as expected. However, if you change the dropdown so that the directive gets ng-switch-ed out, the event stops getting caught. If you look in the console, the event is still gettting $emit-ed, but the controller just stops catching it. Even if I put the $on on the $rootScope(http://jsfiddle.net/uysAM/1/), it still has the same problem. If the event is still being $emit-ed, why would the scopes stop catching it?

If you change the src in the <script> tag at the top to use 1.0.2, it works just fine. Is this some new bug with the latest version? Thanks for any help.

2
nl ja de
Я думаю, что эта проблема связана с областью определения, просто проверяя область консоли. $ on («THE_EVENT», function (event) {scope. $ apply (function() {$ log.info («получил THE_EVENT»); $ log. info (event.targetScope); $ log.info (event.currentScope); scope.numEvents ++;});
добавлено автор Ajay Beniwal, источник

1 ответы

Это проблема масштаба. Вот как я это понимаю.

Цепочка области действия, когда foo = 1

  • MyCtrl's scope <- We catch here
    • ngSwitch's scope for foo="1"
      • myDirective's scope <- We emit here

Цепочка охвата цела, и мы можем поймать испущенное событие без проблем.

Цепочка области действия изменяется, когда foo = 2

  • MyCtrl's scope
    • null <- Is destroyed and set to null for memory management.
      • myDirective's scope

Цепочка охвата больше не повреждена. Испущенное событие не распространяется на очищенную родительскую область myDirective. Возможно, эта очистка была добавлена ​​как функция в 1.0.4.

Here is my solution to the problem. I use a fileLoader service to share state between the directive and the controller.http://jsfiddle.net/apBZX/

var myApp = angular.module("myApp", [])

myApp.controller('MyCtrl', function ($scope, $rootScope, fileLoader) {
    $scope.$watch(function() {
        return fileLoader.numberOfloadedFiles;
    }, function (numberOfLoadedFiles) {
        $scope.numberOfLoadedFiles = numberOfLoadedFiles;
    });
    $scope.foo = 1;
});

myApp.directive("myDirective", function (fileLoader) {
    return {
        restrict: 'A',
        replace: true,
        scope: {},
        template: '<div>I am the directive</div>',
        link: function (scope, element, attrs) {
            if (!fileLoader.isLoading) {
                fileLoader.loadFiles(scope);
            }
        }
    }
});

myApp.service("fileLoader", function() {
    return {
        numberOfloadedFiles: 0,
        isLoading: false,
        loadFiles: function (scope) {
            var self = this;
            setInterval(function() {
                scope.$apply(function(){
                    self.numberOfloadedFiles++;
                });
            }, 1000);
            self.isLoading = true;
        }
    };
});
0
добавлено
Angular — русскоговорящее сообщество
Angular — русскоговорящее сообщество
3 960 участник(ов)

Общаемся на темы Angular 4+, его экосистемы, TypeScript, NativeScript и т.д. По вопросам SSR, Angular Universal @angular_universal_ru См. также: @typescript_ru, @react_js, @nodejs_ru, @js_ru Вакансии и поиск работы: @javascript_jobs

Angular.js (1.x) — русскоговорящее сообщество
Angular.js (1.x) — русскоговорящее сообщество
704 участник(ов)

Общаемся и обсуждаем темы, посвященные Angular 1.x и экосистеме.

AngularJS, Javascript
AngularJS, Javascript
370 участник(ов)

Angularjs russian chat