Поведение Angular $rootScope при запуске и обновлении

У меня есть следующий фрагмент кода в Angular:

  $rootScope.commands.forEach(function(element, index, array){
            commands[element] = function() {alert(element + " Test Command!");}
  });

Это работает, когда я захожу в приложение в первый раз. То есть, если я проверяю объект commands JSON, он содержит записи из $rootScope.commands.

Проблема возникает, когда я обновляю страницу. Именно тогда я получаю сообщение об ошибке, что $rootScope.commands не определено.

Почему это происходит? Очевидно, что существует разница в поведении между входом в систему в первый раз и простым обновлением страницы.

Любые идеи?


person MadPhysicist    schedule 30.07.2016    source источник


Ответы (1)


Когда вы входите в систему, я предполагаю, что вы устанавливаете $rootScope.commands. Когда вы обновляетесь, вы больше не вызываете этот код входа (поскольку вы уже вошли в систему). Все, что установлено в переменных javascript, будет просто уничтожено при перезагрузке страницы, и его нужно будет сбросить с помощью функций инициализации.

Моя рекомендация: добавьте код запуска, используя angular.module('your_module_name').run(), и проверьте, вошел ли пользователь в систему. Если это так, снова создайте $rootScope.commands.

person Goodbye StackExchange    schedule 30.07.2016
comment
Это не столько касается входа в систему (по крайней мере, мне так кажется). У меня есть контроллер, который вызывается, когда маршрут / и устанавливает $rootScope.commands=[]. Затем я заполняю фактические записи в другом (я полагаю) дочернем контроллере. То есть я предполагаю, что HomeCtrl является самым высоким уровнем, так как он вызывается на app.config перед другими контроллерами, объявленными в этом партиале home.html. - person MadPhysicist; 30.07.2016
comment
Вы написали Это работает, когда я впервые захожу в приложение - person Goodbye StackExchange; 30.07.2016
comment
Да. Но я все еще не понимаю, почему это происходит. Какое отношение вход в систему имеет к областям действия? - person MadPhysicist; 30.07.2016
comment
Вы все приложение, области, все уничтожается при обновлении страницы. Все они хранятся в переменных в javascript, которые не сохранятся при перезагрузке страницы. Вам придется перестроить все заново, когда загрузится прицел. - person Goodbye StackExchange; 30.07.2016
comment
Это то, что я предполагал. Тем не менее, чем это отличается от входа в систему заново? Будет ли маршрут / эквивалентен обновлению на том же маршруте? - person MadPhysicist; 30.07.2016
comment
Ну, все, что вы делаете для заполнения своих команд, не запускается при обновлении страницы. - person Goodbye StackExchange; 30.07.2016
comment
Да, это ясно. Итак, что делает module.run()? Запускается всякий раз, когда есть новый запуск или обновление? - person MadPhysicist; 30.07.2016
comment
См. документацию по модулю здесь: Блоки выполнения — выполняются после создания инжектора и используются для запустить приложение. В блоки выполнения можно вводить только экземпляры и константы. Это необходимо для предотвращения дальнейшей настройки системы во время выполнения приложения. - person Goodbye StackExchange; 31.07.2016