2014-08-30 26 views
-1

Я пытаюсь решить лучшую практику для своего контроллера.Как передать переменные в моем случае?

У меня есть несколько контроллеров, и мне нужно передавать данные.

первый контроллер

app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) { 
    $scope.testdata = true; 
}]) 

второй контроллер

app.controller('secondCtr', ['$scope','$rootScope', function($scope, $rootScope) { 
    var test = $rootscope.testdata; 

}]) 

Мой второй вариант заключается в использовании $ родителю

первый контроллер

app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) { 
    $scope.testdata = true; 
}]) 

второй гр ontroller

app.controller('secondCtr', ['$scope','$rootScope', function($scope, $rootScope) { 
    var test = $scope.$parent.$parent.testdata; 
}]) 

Я не уверен, что это лучший способ сделать это. Кто угодно? Благодаря!

+0

Как структурирован ваш контроллер? Я бы рекомендовал не использовать $ parent – PSL

ответ

3

Вы можете вместо этого уведомлять другого контроллера, используя событие.

Пример: -

app.controller('testCtr', ['$scope','$rootScope', function($scope, $rootScope) { 
    $scope.testdata = true; 
    $rootScope.$broadcast('DATA_UPDATED', $scope.testdata); 
}]); 

и получать с помощью

app.controller('secondCtr', ['$scope','$rootScope', function($scope) { 
    $scope.$on('DATA_UPDATED', function(e, data){ 
     testData = data; 
     //do something with the data 
    }); 
}]); 

Опять же это полностью зависит от того, как контроллер устроен, и вместо передачи данных вокруг you could use a service (which are singletons) which manages the data. Таким образом, один контроллер может просто уведомить другого контроллера о том, что «я обновил, теперь вы его получите». Другой контроллер мог бы ввести зависимость от той же службы, которая делится и управляет данными, получая уведомление о событии, которое может вызвать службу, и получить обновленные данные. Here is another good read on various services options in angular

Снова использование $rootScope к $broadcast (downwards) или $emit(upwards) или только с помощью самого $scope сделать это зависит от того, как контроллеры структурированы ($ rootScope.broadcast помогает решить это, но вам нужно впрыснуть $ rootScope иногда неудобно) , Но всегда лучше иметь такую ​​же реализацию везде, не беспокоясь о том, как структурированы контроллеры, i have a pub/sub mechanism created for that, which i generally use and you can find it here. Другое дело беспокоиться, когда вы обмениваетесь данными между контроллерами, если вы обходите объекты, то ссылка на объект копируется на цель, поэтому любое обновление на целевом объекте будет отражать изменение в самом источнике, в некоторых случаях это нежелательно вы могли бы angular.copy(data) данные при источнике при отправке.

Также отметим, что объемы следуют прототипичный шаблон наследования, то есть все области применения (кроме изолированного объема, $scope.$new(true)) унаследованы от своего родителя, в конечном счете, все они являются производными от $rootScopewhich means a child scope can access свойство, установленной на его предков (с помощью цепи прототипов).

В конечном счете существует множество способов передачи данных, уведомления, совместного использования/доступа к данным между различными компонентами.

2

Лучший способ - использовать сервис или завод. Вы можете проверить this video from egghead.io Услуги - объекты одноэлементные, это означает, что у них есть только один экземпляр. Когда вы создадите экземпляр службы в контроллере, вы не сможете создать новую в другой, вместо этого вы получите ссылку на существующий экземпляр и получите доступ к данным с нескольких контроллеров!

Посмотрите видео, он может объяснить это лучше, чем я могу;)

Смежные вопросы