От Angluar docs: каждое приложение имеет единый корневой объем. Все остальные области видимости представляют собой потоки потомков корневой области. Области обеспечивают разделение между моделью и видом, с помощью механизма для просмотра модели изменений.
Конечно, это будет связано с вопросом мнения и стиля. Я, как правило, придерживаюсь стиля, очень близкого к John Papa's Angular Style Guide.
В соответствии с этими двумя принципами, а также после хорошего разделения проблем, моя архитектура содержит фабричные модели, которые совместно используются в приложении. Мои контроллеры, в свою очередь, привязаны к службам, в которых хранятся общие данные.
Использование $ 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(){
}
}
Here весело сообщение о привязке к услугам, а не обслуживать свойства.
В целом, вы должны быть судьей того, что лучше всего подходит для вас. Хорошая системная архитектура и хороший стиль избавили меня от бесчисленных часов решения полностью возможных проблем.
Проблема заключается в том, что он используется через приложение для всего, и мы должны его реорганизовать, поэтому совместное использование данных - это только одна проблема. –
Я понимаю, что вы имеете в виду. Ну, я думаю, что если вы действительно вынуждены реорганизовать приложение, вам нужно написать отдельные модули для инкапсуляции различных логик. Это займет много времени! Если вы ищете лучшие практики для инкапсуляции логики в разные модули, просто взгляните на [Документация модулей] (https://docs.angularjs.org/guide/module). Я также предлагаю вам попробовать небольшую демонстрацию, чтобы понять, как работать с некоторыми отдельными модулями, с их соответствующими контроллерами, службами и областями и, в конце, начать рефакторинг. – AndreaM16
Если у меня есть служба, которая часто используется во всем приложении, и мне нужно подключить к множеству контроллеров, есть ли лучший способ, чем вставлять ее в любой другой контроллер? сделать его доступным через $ rootScope? Немного новый для Advanced Angular Concepts. –