У меня есть макет страницы с двумя контроллерами одновременно, один хранит данные, отображаемые как вид боковой навигации, на основе данных, хранящихся в локальном хранилище браузеров, и по меньшей мере одного другого контроллера, который привязан к маршруту и виду ,Является ли это хорошим способом синхронизации данных между двумя контроллерами?
Я создал этот маленький графический провод кадра ниже которого показывает макет страницы:
Второй контроллер используется для манипулирования локальных хранимых данных, и выполняет действия, такие как добавление нового элемента или удаление существующего один. Моя цель - синхронизировать данные, если элемент «ManageListCrtl» добавлен или удален, боковая навигация с помощью «ListCtrl» должна немедленно обновиться.
Я архивировал это, разделив логику локального хранилища на службу, которая выполняет широковещательную рассылку при манипулировании списком, каждый контроллер прослушивает это событие и обновляет список областей.
Это прекрасно работает, но я не уверен, что есть лучшая практика.
Вот урезанная версия моего кода, содержащий только необходимые части:
angular.module('StoredListExample', ['LocalObjectStorage'])
.service('StoredList', function ($rootScope, LocalObjectStorage) {
this.add = function (url, title) {
// local storage add logic
$rootScope.$broadcast('StoredList', list);
};
this.delete = function (id) {
// local storage delete logic
$rootScope.$broadcast('StoredList', list);
};
this.get = function() {
// local storage get logic
};
});
angular.module('StoredListExample')
.controller('ListCtrl', function ($scope, StoredList) {
$scope.list = StoredList.get();
$scope.$on('StoredList', function (event, data) {
$scope.list = data;
});
});
angular.module('StoredListExample')
.controller('ManageListCtrl', function ($scope, $location, StoredList) {
$scope.list = StoredList.get();
$scope.add = function() {
StoredList.add($scope.url, $scope.title);
$location.path('/manage');
};
$scope.delete = function (id) {
StoredList.delete(id);
};
$scope.$on('StoredList', function (event, data) {
$scope.list = data;
});
});