Обмен данными между контроллерами в AngularJS: фабрика

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы обмениваться данными между контроллерами в AngularJS, пользуйтесь сервисами. Они являются синглтонами и предназначены для поддержки одного и того же источника данных. Создайте сервис, который будет хранить информацию, и инжектируйте его в нужные части вашего приложения.

JS
Скопировать код
// Сервис для хранения и управления общими данными
app.service('SharedData', function() {
  var data = {};
  return {
    get: function() { return data; },
    set: function(newData) { data = newData; }
  };
});

// Пример использования SharedData в контроллере A
app.controller('CtrlA', function($scope, SharedData) {
  SharedData.set({ shared: 'info' });
});

// Пример использования SharedData в контроллере B
app.controller('CtrlB', function($scope, SharedData) {
  $scope.info = SharedData.get();
});

Теперь контроллеры CtrlA и CtrlB имеют синхронизированное состояние благодаря общеиспользуемому сервису SharedData.

Кинга Идем в IT: пошаговый план для смены профессии

Дополнительные методы обмена в AngularJS

Помимо сервисов, в AngularJS существуют и другие паттерны для передачи данных между контроллерами, такие как наблюдение за переменными через $watch, использование параметров маршрутизации $stateParams и взаимодействие с помощью событий $broadcast и $emit.

Связывание данных через ng-model

ng-model позволяет связывать переменные с $scope и обеспечивает их автоматическое обновление в представлении.

JS
Скопировать код
app.controller('CtrlA', function($scope, SharedData) {
  $scope.sharedData = SharedData.get();
  $scope.updateData = function(newInfo) {
    $scope.sharedData.info = newInfo;
    SharedData.set($scope.sharedData);
  };
});

Пример использования в HTML:

HTML
Скопировать код
<input type="text" ng-model="sharedData.info" ng-change="updateData(sharedData.info)">

Отслеживание изменений через $watch

$watch может служить средством наблюдения за изменениями данных внутри $scope в более сложных приложениях.

JS
Скопировать код
app.controller('CtrlA', function($scope, SharedData) {
  $scope.$watch(function() {
    return SharedData.get();
  }, function(newValue, oldValue) {
    if (newValue !== oldValue) {
      $scope.info = newValue;
    }
  }, true);
});

Параметры маршрутизации $stateParams для передачи данных

Хорошим способом передать данные между маршрутами является использование параметров URL с помощью $stateParams.

JS
Скопировать код
app.controller('CtrlA', function($scope, $stateParams, SharedData) {
  SharedData.set({ shared: $stateParams.info });
});

Методы $broadcast и $emit для взаимосвязи

AngularJS предоставляет механизмы взаимодействия через события, используя методы $broadcast и $emit.

JS
Скопировать код
// Родительский контроллер отправляет сигнал о обновлении данных
$scope.$emit('dataUpdated', newData);

// Дочерний контроллер слушает сигналы
$scope.$on('dataUpdated', function(event, data) {
  $scope.info = data;
});

Визуализация

Два повара на двух разных кухнях готовят пиццу и используют общий склад ингредиентов.

Markdown
Скопировать код
Повар 1 (👩‍🍳): Мне нужны помидоры, сыр и базилик.
Повар 2 (👨‍🍳): Мне тоже нужны помидоры, сыр и базилик.

Этот общий склад аналогичен сервису, посредством которого повара обмениваются общими ингредиентами.

Markdown
Скопировать код
👩‍🍳 ↔️ 🍱 ↔️ 👨‍🍳

Продвинутые приемы обмена данными в AngularJS

Разберем управление жизненным циклом данных и практики поддержания кода для сложных приложений.

Управление жизненным циклом данных

Важно корректно удалять данные при уничтожении контроллера и сохранять при переходе к дочерним маршрутам.

JS
Скопировать код
app.controller('CtrlA', function($scope, SharedData, $rootScope) {
  var cleanUp = $rootScope.$on('$destroy', function() {
    SharedData.set({});
  });

  $scope.$on('$destroy', cleanUp);
});

Поддержка кода

Код легче поддерживать, когда он структурирован и не злоупотребляет использованием $rootScope.

Полезные материалы

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