2017-01-09 4 views
0

У меня есть приложение, в котором я использую главный ctr под названием `AppCtrl ', который я использую для обмена некоторыми глобальными варами, помощниками и данными.Угловое условие выполнения перед загрузкой контроллера

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

Например, в AppCtrl мне нужно загрузить некоторые пользовательские данные из моей базы данных, но мне нужно, чтобы маршрут или вторичный контроллер, позволяет называть его HomeCtrl, ждет этого, прежде чем он может загрузить его содержимое, так как он dependes на информация от AppCtrl.

Я использую $scope var для обмена данными между контроллерами.

Итак, как я могу сделать HomeCtrl wait for the end of AppCtrl Выполнение запуска для его обработки?

EDIT:

Я создал Pastebin, http://pastebin.com/CUtTmKzT, чтобы поделиться своим AppCtrl и пример моего HomeCtrl. Для ясности я удалил много контента и оставил только некоторые подписи, чтобы вы могли понять, чего я пытаюсь достичь.

Чтобы объяснить это лучше, я хочу выполнить некоторые методы на каждой загрузке страницы, которые будут запрашивать некоторые данные из моего api и делиться им между всеми моими контроллерами. Я могу сделать это только один раз, так как приложение будет активно использоваться.

Итак, после моего Pastebin кода у меня есть метод handleLoginSuccess, который будет вызываться после того, как пользователь получит доступ приложения, он будет проверять, существует ли данные пользователя на моем $rootScope, если он делает это будет вызывать метод обработайте эти данные, setCurrentUser, и если это не так, он вызовет метод запроса этих данных из api, getUserData, а затем вызовет другой метод для его обработки.

+0

у вас есть несколько пробелов в знании углового каркаса здесь, что сделает это очень трудным. Во-первых, цикл '$ digest', который отображает HTML, не привязан к порядку загрузки контроллеров. Во-вторых. каждый контроллер имеет свой собственный '$ scope', поэтому использование' $ scope' для «совместного использования» данных может потенциально создать некоторые неприятные проблемы при устранении ошибок. Вы можете подумать о своей архитектуре здесь и подумать об использовании директив или компонентов или использовать маршрутизатор для управления своими представлениями. – Claies

+0

@Claies, не могли бы вы привести пример того, как я могу использовать директиву или компоненты для обмена данными?Потому что я не вижу, как они могли бы делиться им между контроллерами без использования области действия и без попадания в базу данных все время. Кроме того, я не говорил о html-рендере, но при выполнении методов – Terkhos

+1

хорошо, обмен данными лучше оставить поставщикам (сервисам или фабрикам, обычно), которые являются объектами singleton. Я упоминаю только директивы и компоненты, потому что вы пытаетесь понять иерархическую природу вашего HTML здесь, какие контроллеры не строго строго придерживаются. – Claies

ответ

0

https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md

^Лучший гид использовать угловые. Кроме того, я хотел бы изучить некоторые учебники о том, как используется $ scope.

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

+0

Да, это то, чему я тоже научился, но я как бы потерял себя от этого, потому что у меня есть эти данные, которые нужно разделить повсюду, и я не могу ударить по БД все время, а также не могу сохранить его на куки или хранить с тех пор он довольно большой. Спасибо, и я рассмотрю руководство. – Terkhos

+0

Похоже, вам может понадобиться создать службу, касающуюся БД, и тогда вы сможете использовать эту службу среди других контроллеров, если это необходимо. Мне нравится держать вещи как можно более раздельными, поэтому у меня нет проблем с связью. – DDelgro

+0

Да, это то, что я сделал, у меня есть несколько из них, и у меня также был один для этих данных, но мне пришлось уменьшить количество попаданий в базу данных. Если я использую услугу, мне нужно «сохранить» данные где-нибудь, чтобы я не мог снова нажать ее снова? Как я могу сделать это с помощью служб и без использования '$ scope'? – Terkhos

0
In 1st controller like AppCtrl,you can pass the data like: 

$rootScope.$broadcast('scanner-started', { any: {} }); 

then in second controller HomeCtrl,you can fetch the data like- 

$scope.$on('scanner-started', function(event, args) { 
    var anyThing = args.any; 
    // do what you want to do 
}); 
+0

Это не работает, так как у меня есть много методов, которые выполняются одновременно в 'HomeCtrl', мне нужно выполнение/запуск контроллера для конца' AppCtrl '. Это также не похоже на хорошую альтернативу, потому что мне нужно будет добавить много слушателей. – Terkhos

0

Я думаю, что вы должны взглянуть на ngRoute или ui-router. Ui-router имеет вложенные состояния, которые имеют дату передачи из родительского состояния в дочернее. И вы сможете разрешить некоторые обещания из родительского состояния и решить разрешить пользователю состояние ребенка или, может быть, вы переадресовываете пользователя на вход в систему. https://github.com/angular-ui/ui-router/wiki/Nested-States-and-Nested-Views

+0

Я пробовал это, но мой 'HomeCtrl' все еще выполняется перед 'AppCtrl'. Я создал абстрактное состояние, называемое 'main', и переместил мое состояние' home' в 'main.home' и поставил контроллер основного состояния как' AppCtrl'. Должен ли я делать что-то другое? – Terkhos

Смежные вопросы