Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Помогите с архитектурой простой логики (https://javascript.ru/forum/angular/48786-pomogite-s-arkhitekturojj-prostojj-logiki.html)

dtzscln 17.07.2014 00:06

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

Может у меня в целом архитектура сильно хромает, тогда подскажите как было бы правильнее.

dtzscln 17.07.2014 16:45

Немного перефразирую.
Как из контроллера регестрировать изменения локальной переменной сервиса?

nerv_ 17.07.2014 17:01

Sharing Data Between Controllers
Directive Communication
Directives Talking to Controllers

An Alternative Approach to Controllers
Experimental "Controller as" Syntax

dtzscln 17.07.2014 18:27

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

nerv_ 17.07.2014 18:57

http://jsfiddle.net/HB7LU/5045/

MetaDriver 30.10.2014 09:16

Цитата:

Сообщение от nerv_ (Сообщение 321522)

А круто, кстати. Самый простой метод из когда либо увиденных.
Беру себе... :)


Часовой пояс GMT +3, время: 08:12.