2014-09-22 2 views
1

Я пытаюсь поделиться некоторой информацией между контроллерами с угловыми. Я знаю, что это не слишком сложно сделать, я нашел здесь несколько отличных примеров, но у меня есть немного странный сценарий с тем, как я ввожу и меняю данные, которые я пытаюсь разделить. Я попытался применить некоторые другие примеры, которые я нашел, чтобы заставить это работать, но не может показаться, что это работает, поэтому я попытаюсь объяснить как можно яснее.угловой, обмен между контроллерами (после того, как он был заполнен?)

Проблема

То, что я пытаюсь сделать, это довольно прямо вперед. У меня есть некоторые значения выпадающих значений, которые я пытаюсь использовать между контроллерами. Таким образом, любое значение, которое оно имеет при посадке и было заполнено, и когда оно изменится, будет показано на другом контроллере.

Проблема в том, что я установил большую фабрику, из которой все контроллеры звонят, чтобы заполнить свои входы, есть 10 контроллеров, и у каждого есть куча входов, которые необходимо заполнять при посадке, поэтому у меня есть завод с функцией $ q.all для каждого из $ http-вызовов, хранящихся в vars, затем. then then, который вызывает другой вызов, чтобы увидеть, сохранены ли какие-либо данные и изменены значения по умолчанию на сохраненные значения. Я бы предпочел, если возможно, сохранить этот метод. Я использую его повсюду, и может быть больно изменить его.

Так завод выглядит следующим образом:

var criteria1 = $http({method: "GET", url: "/crit1"}); 
var criteria2 = $http({method: "GET", url: "/crit2"}); 
var criteria3 = $http({method: "GET", url: "/crit3"}); 

    return { 
critera: $q.all([criteria1 ,criteria2, criteria3]) 
} 

В контроллере я тогда сделать:

getDefaults.criteria.then(function(data){ 

//fill out defaults and values for selects with this data 

//then get saved data (if any) 
$http({ 
      method: "GET", 
      url: "/getsavedData/" + sectionID 
     }) 
     .success(function(data, status, headers, config){ 
     //if data !null then overrite scopes for defaults 
     }; 

Так что я пытаюсь сделать, это то делим значение 2 отдельных списков по этому вопросу контроллер с другим. Мне был предоставлен этот пример - http://jsfiddle.net/HB7LU/6510/. Но я не могу понять, как применить это к тому, что я делаю. В основном потому, что данные определяются за пределами контроллера, где ему необходимо обмениваться. Я пытаюсь избежать этого, но если это лучший способ, то я, вероятно, должен его изменить.

Я хочу, чтобы входы заполнялись, получали значения по умолчанию, а затем делили информацию с контроллерами (и делились, когда они менялись). Было бы идеально, если бы я мог сделать что-то похожее на то, что делает двухстороннее связывание данных, но между контроллерами, поэтому контроллер, который я кормлю, всегда загружает информацию о ответе выбора списка. Я немного боролся с этим, это должно быть легко, я думаю, что я просто думаю об этом неправильно. Любое направление было бы высоко оценено. Спасибо, что нашли время для чтения!

+0

Почему вы не просто устанавливаете извлеченные данные в общедоступное свойство службы, и каждый из заинтересованных контролеров смотрит эти данные? –

+0

Что-то вроде [this] (http://stackoverflow.com/questions/21452040/angularjs-sharing-methods-between-controllers/21452417#21452417), но вам нужно установить 'var msg = ...' на результат вашего $ q.all(). –

+0

Рассматривали ли вы использование $ broadcast и $ on? [Ссылка] (https://docs.angularjs.org/api/ng/type/$rootScope.Scope) –

ответ

1

Не уверен, что это то, что вы ищете, но создание «Сервиса» и прослушивание его от других контроллеров может пригодиться. Что-то вроде этого упоминается здесь: https://stackoverflow.com/a/19469131/2658127

Вы можете изменить <input> на все, что захотите.

0

Вы можете использовать события.

Scope Documentation

В этом проверить $on, $broadcast и $emit.

В общем случае использование angular.element(catapp).scope() предназначено для использования вне угловых контроллеров, например, в событиях jquery.

В идеале в вашем использовании можно было бы написать событие в контроллер 1, как:

$scope.$on("myEvent", function (event, args) { 
    $scope.rest_id = args.username; 
    $scope.getMainCategories(); 
}); 

А во втором контроллере вы бы просто сделать

$scope.initRestId = function(){ 
    $scope.$broadcast("myEvent", {username: $scope.user.username }); 
}; 

Edit: Реализовано это было связи между два модуля

Можете ли вы попробовать включить модуль firstApp в качестве зависимости от secondApp, где вы объявляете angular.module. Таким образом, вы можете общаться с другим приложением.

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