Из документов Angluar: Каждое приложение имеет единую корневую область. Все остальные области являются дочерними областями корневой области. Области обеспечивают разделение между моделью и представлением с помощью механизма отслеживания изменений модели.
Конечно, это будет зависеть от мнения и стиля. Я склонен следовать стилю, очень близкому к Руководству по стилю Angular Джона Папы.
В соответствии с этими двумя и следуя стратегии хорошего разделения задач, моя архитектура содержит фабричные модели, которые являются общими для всего приложения. Мои контроллеры, в свою очередь, привязаны к службам, которые содержат общие данные.
Использование $rootScope в качестве глобальной шины событий — это именно то, как его использует Angular. Должны ли вы последовать за ним и сделать то же самое? Я не понимаю, почему бы и нет. Но если да, убедитесь, что цель четко определена, и, возможно, даже используйте свой собственный сервис для регистрации событий в глобальной шине событий. Таким образом, вы отделяете свое приложение от Angular, и если вы когда-нибудь решите изменить структуру, в которой живет ваша глобальная шина событий, вы можете изменить ее в одном месте.
Вот что я предлагаю:
Глобальная шина событий
// Angular specific: add service to module
angular.module('app').factory('globalEventBus', GlobalEventBus);
// Angular specific: inject dependencies
GlobalEventBus.$inject(['$rootScope']);
// Non framework specific.
// param: fameworkEventBus will be $rootScope once injected
function GlobalEventBus(fameworkEventBus) {
var globalEventBus = this;
globalEventBus.registerEvent(params...){
fameworkEventBus.
}
return globalEventBus;
}
Глобальные модели данных
Мои модели данных умны и, как правило, содержат функции, которые предоставляют информацию о себе или извлекают/возвращают определенные данные.
// Angular specific: add service to module
angular.module('app').factory('dataModel', DataModel);
function DataModel() {
var dataModel= this;
dataModel.myData = {};
dataModel.GetSpecificData = funtion(param){
return ...
}
return dataModel;
}
Контроллер
// Angular specific
angular.module('app').controller('MyController', MyController);
// Angular specific: inject dependencies to controller
MyController.$inject = ['dataModel'];
// By convention I use the same parameter name as the service.
// It helps me see quickly if my order of injection is correct
function MyController(dataModel) {
var myController = this;
// Bind to the service itself, and NOT to the service data property
myController.myData = dataModel;
myController.doStuff = function(){
}
}
Вот забавный пост о привязке к службам, а не к свойствам службы.
В общем, вы должны быть судьей того, что лучше всего подходит для вас. Хорошая системная архитектура и хороший стиль сэкономили мне бесчисленное количество часов решения проблем, которых можно было избежать.
person
Wilmer SH
schedule
11.02.2016