Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.07.2014, 00:06
Интересующийся
Отправить личное сообщение для dtzscln Посмотреть профиль Найти все сообщения от dtzscln
 
Регистрация: 16.07.2014
Сообщений: 15

Помогите с архитектурой простой логики
Новичек. Оф. документацию читал, стековерфлоу тоже.
Суть:
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 выбраного человека.

Может у меня в целом архитектура сильно хромает, тогда подскажите как было бы правильнее.
Ответить с цитированием
  #2 (permalink)  
Старый 17.07.2014, 16:45
Интересующийся
Отправить личное сообщение для dtzscln Посмотреть профиль Найти все сообщения от dtzscln
 
Регистрация: 16.07.2014
Сообщений: 15

Немного перефразирую.
Как из контроллера регестрировать изменения локальной переменной сервиса?
Ответить с цитированием
  #3 (permalink)  
Старый 17.07.2014, 17:01
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Sharing Data Between Controllers
Directive Communication
Directives Talking to Controllers

An Alternative Approach to Controllers
Experimental "Controller as" Syntax
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 17.07.2014, 18:27
Интересующийся
Отправить личное сообщение для dtzscln Посмотреть профиль Найти все сообщения от dtzscln
 
Регистрация: 16.07.2014
Сообщений: 15

Посмотрел видео, но всё равно не понимаю.
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()?

Последний раз редактировалось dtzscln, 17.07.2014 в 18:40.
Ответить с цитированием
  #5 (permalink)  
Старый 17.07.2014, 18:57
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

http://jsfiddle.net/HB7LU/5045/
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (permalink)  
Старый 30.10.2014, 09:16
Аватар для MetaDriver
Аспирант
Отправить личное сообщение для MetaDriver Посмотреть профиль Найти все сообщения от MetaDriver
 
Регистрация: 24.04.2014
Сообщений: 66

Сообщение от nerv_ Посмотреть сообщение
http://jsfiddle.net/HB7LU/5045/
А круто, кстати. Самый простой метод из когда либо увиденных.
Беру себе...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите, простой скрипт, закрытие страницы istvi1003 Общие вопросы Javascript 0 17.05.2014 23:39
Помогите с архитектурой приложения epson Общие вопросы Javascript 6 09.02.2012 16:32
Простой вопрос по JavaScript. Работа с датой. Помогите Hanuman Общие вопросы Javascript 3 30.07.2010 20:30
Помогите, пожалуйста, с простой задачей Devi Ваши сайты и скрипты 1 13.07.2010 04:48
Не работает простой код. Помогите, очень надо AntiBuger Internet Explorer 1 27.05.2010 16:35