Я заявляю, что изучаю AngularJS, исходя из множества различных структур MV *. Мне нравится фреймворк, однако у меня возникают проблемы с передачей данных между контроллерами.
Предположим, что у меня есть экран с некоторым вводом (input.html) и контроллер, пусть говорят InputCtrl.
Там есть кнопка на этом представлении, которая выводит вас на другой экран, допустим утвердить (approve.html) с помощью контроллера ApproveCtrl.
Для этого ApproveCtrl нужны данные из InputCtrl. Это похоже на очень распространенный сценарий в больших приложениях.
В моих предыдущих структурах MV * это обрабатывалось бы как (псевдокод):
var self = this;
onClick = function() {
var approveCtrl = DI.resolve(ApproveCtrl);
approveCtrl.property1 = self.property1;
approveCtrl.property1 = self.property2;
self.router.show(approveCtrl);
}
- Сначала это будет работать как Controller. Сначала вы создаете контроллер, имея возможность поместить его в правильное состояние; после этого создается представление.
Теперь, в AngularJS, я обрабатываю это как:
var self = this;
onClick = function(){
self.$locationService.path('approve');
}
- Это работает как View-first. Вы говорите, какой вид/маршрут для навигации, контроллер создается каркасом.
Мне сложно контролировать состояние созданного контроллера и передавать ему данные. Я видел и пробовал следующие подходы, но у всех есть свои проблемы, на мой взгляд:
- Ввести общую службу в InputCtrl и ApproveCtrl и поместить все данные в эту службу
- Это похоже на грязную работу; состояние в общей службе становится глобальным состоянием, а мне просто нужно передать данные в ApproveCtrl
- Срок службы этой общей службы длиннее, чем для нее, - просто для передачи данных в ApproveCtrl
- Передайте данные в $routeParams
- Это становится довольно беспорядочным, когда у вас много параметров.
- Использовать события $scope
- Концептуально, это не то, что я использовал бы для событий - мне просто нужно передать данные в ApproveCtrl, ничего event-ish
- Это довольно громоздко; Я должен сначала отправить событие родительскому, которое затем передало бы ему его детям.
Я что-то упустил? Я создаю слишком много маленьких контроллеров? Я слишком много стараюсь придерживаться привычек из других фреймворков?