Подтвердить что ты не робот

Передавать данные между контроллерами

Я заявляю, что изучаю 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
    • Это довольно громоздко; Я должен сначала отправить событие родительскому, которое затем передало бы ему его детям.

Я что-то упустил? Я создаю слишком много маленьких контроллеров? Я слишком много стараюсь придерживаться привычек из других фреймворков?

4b9b3361

Ответ 1

В терминах структуры AngularJS является более модульным, чем MVC.

Классический MVC описывает 3 простых слоя, которые взаимодействуют друг с другом таким образом, что контроллер строит модель с представлением (а модель не должна работать с View напрямую или наоборот).

В Angular у вас могут быть несколько, совершенно необязательных объектов, которые могут взаимодействовать друг с другом несколькими способами, например:

Possible Interactions

Вот почему существует несколько способов передачи данных между различными объектами. Вы можете:

или

  • Отправка сообщений с использованием бэкэнда AJAX
  • Отправка сообщений с использованием внешней системы (например, MQ)

... и многое другое. Благодаря своему разнообразию Angular разработчик/дизайнер может выбрать способ, которым они наиболее удобны и несут. Я рекомендую прочитать Руководство разработчика AngularJS, где вы можете найти благословенные решения для некоторых распространенных проблем.

Ответ 2

Если вы намерены просто обмениваться данными между двумя видами, возможно, это сервис. Если вы заинтересованы в сохранении хранилища данных, вам может потребоваться какая-то вспомогательная служба, такая как REST API. Взгляните на сервис $http для этого.

Ответ 3

Даже если XLII дал полный ответ, я нашел этот учебник, используя сервис. Это очень интересный и простой способ обмена данными между контроллерами, используя свойство 2-х связывания: https://egghead.io/lessons/angularjs-sharing-data-between-controllers

Я до сих пор не использовал его.

В противном случае существует и этот другой способ, основанный на событиях: http://www.objectpartners.com/2013/08/21/using-services-and-messages-to-share-data-between-controllers-in-angularjs/

Ответ 4

Если вы хотите передать простые строковые данные с одной страницы (стр. 1) на другую страницу (стр. 2), одним из решений является использование традиционных параметров URL. Вызовите URL-адрес маршрута page2 с параметром, например "/page2/param1/param2" . Контроллер страницы2 получит параметры в " routeParams". Вы сможете получить доступ к параметрам как routeParams.param1 и routeParams.param2. Код ниже принят из: Как получить параметры URL с помощью angular js

Вызовите маршрут page2 из контроллера page1 (js) или url в своем html с параметрами как:

"/page2/param1/param2"

Page2 route:

$routeProvider.when('/page2/:param1/:param2', {
    templateUrl: 'pages/page2.html',    
    controller: 'Page2Ctrl'
});

И контроллер:

.controller('Page2Ctrl', ['$scope','$routeParams', function($scope, $routeParams) {
  $scope.param1 = $routeParams.param1;
  $scope.param2 = $routeParams.param2;
  ...
}]);

Теперь вы можете получить доступ к параметрам (param1 и param2) в вашем html/template page2.