Помогите с архитектурой простой логики
Новичек. Оф. документацию читал, стековерфлоу тоже.
Суть: 1) есть два соседа-контроллера: <div ng-controller="firstController"> <ul> <li ng-repeat="message in messages">{{ message.text }}</li> </ul> </div> <div ng-controller="secondController"> <div ng-repeat="man in mans" ng-click="loadMessages(man.id)" class="chuvak">{{ man.name }}</div> </div> 2) Есть сервис, который достает с сервера коллекцию messages конкретного человека по его по id. И кеширует их в простейшем обьекте в виде связки id: messages: app.factory("History", function($resource, $q) { var cache = {}; var r = $resource("index.php"); var current; return { get: function() { if (!cache[current]) { var items = r.query({id: current}); return items.$promise; } else { var fromCache = cache[current]; var defer = $q.defer(); defer.resolve(fromCache); return defer.promise; } }, save: function(id, content) { if (content) { cache[id] = content; } }, setClient: function(id) { current = id; } }; }); 3) Этим сервисом пользуются оба контроллера: Первый контроллер - вывод списка сообщений для конкретного человека: function firstController($scope, History) { var manId = 1; History.setClient(manId); History.get() .then(function(data) { $scope.messages = data; }, function(error) { }) .finally(function() { History.save(manId, $scope.messages); }); } Второй контроллер - вывод списка людей. По клику на конкретного человека нужно в первом контроллере отобразить его messages: function secondController($scope, History) { $scope.mans = [ {id: 1, name: "vasua"}, {id: 2, name: "petya"} ]; $scope.loadMessages = function(id) { History.setClient(id); } } Проблема: когда я жму по конкретному пользователю в secondController и отрабатывает loadMessages(), которая обновляет в сервисе History id текущего клиента...вот в этом месте нужно, что бы в первом контроллере заново вызвалась History.get(), которая подтянет messages выбраного человека. Может у меня в целом архитектура сильно хромает, тогда подскажите как было бы правильнее. |
Немного перефразирую.
Как из контроллера регестрировать изменения локальной переменной сервиса? |
|
Посмотрел видео, но всё равно не понимаю.
EggHead в видео Sharing Data Between Controllers приводит ну совсем уж элементарный пример. Можете объяснить на простом примере, как сделать взаимодействее между контроллерами через сервис? <div ng-controller="MainController"> <h1>{{ name }}</h1> </div> <div ng-controller="AsideController"> <button ng-click="changeName()">change name</button> </div> myApp.factory("fac", function($rootScope) { var name = "ivan"; return { setName: function(n) { name = n; }, getName: function() { return name; } }; }); function MainController($scope, fac) { $scope.fac = fac; $scope.name = $scope.fac.getName(); } function AsideController($scope, fac) { $scope.fac = fac; $scope.changeName = function() { $scope.fac.setName("another name"); } } http://jsfiddle.net/HB7LU/5044/ Возможно, существует какое-нибудь красивое решение через $apply() и $watch()? |
|
Цитата:
Беру себе... :) |
Часовой пояс GMT +3, время: 08:12. |