2013-08-28 2 views
2

У меня есть служба, которая вводится в мои контроллеры. Служба определяет ряд функций.angularjs: использование сервиса для связи между контроллерами

Теперь я хотел бы добавить переменную к этой службе, которая удерживала бы selectedItem в приложении. Я сделал это так:

angular.module('myservices', []). 
factory('serviceA', function() {   

    var serviceA= { 
     selectedItem: selectedItem,  
     ... more functions here 
    }; 
    return serviceA; 

    var selectedItem; 
    ... functions go here 
}); 

В одном из моих контроллеров я устанавливаю выбранный элемент:

serviceA.selectedItem = someItem; 

и в другой контроллер вид ссылается на выбранный элемент, как это:

<span>{{serviceA.selectedItem.value}}</span> 

Пробел никогда не обновляется, хотя выбранный элемент установлен правильно. Что я делаю не так ?

+0

Я разыграл эту скрипку несколько раз, чтобы работать над связью между контроллерами: http://jsfiddle.net/patxy/RAVFM/ (извините, я не помню, кто сделал это сначала). Эта скрипка использует событие для этого ($ scope.broadcast). Я предлагаю вам сохранить службу и запустить событие в эту службу. –

+0

Я хочу избежать использования трансляции.На самом деле, службы в angularjs являются singleton, и именно поэтому я хочу использовать его для общей переменной между контроллерами. Я только использовал трансляцию и излучал для директив – Sam

ответ

7

Чтобы получить доступ к сервису, на ваш взгляд, вам нужно присвоить его объем:

$scope.serviceA = serviceA;

http://jsfiddle.net/MzJsZ/

+1

Это приятно. Я также обновил демоверсию, чтобы проверить себя. http://jsfiddle.net/MzJsZ/1/ – codef0rmer

+0

Я отправил свой собственный ответ перед вами. Но я собираюсь принять твое. Танск за помощь! – Sam

1
angular.module('myservices', []).factory('serviceA', function() {   
    return { 

//// завод возвращает объект

 var serviceA= { 
     selectedItem: selectedItem,  
     ... more functions here 
    }; 
    return serviceA; 

    var selectedItem; 
    ... functions go here 

} 

}); 

делает эту работу? вам не удалось получить часть возврата {}, где все идет туда. если вы будете использовать услугу, вы должны написать именно этот.serviceA = {...}

и ваш код в контроллере отсутствует $ scope!

$scope.someItem= serviceA.selectedItem; 

или (я действительно не знаю, что вы хотите) $scope.serviceA.selectedItem= someItem;

Затем в пролете

<span>{{someItem.value}}</span> 

или (я действительно не знаю, что вы хотите) <span>{{serviceA.selectedItem.value}}</span>

PS Мне не нравится, что имя вашего контроллера совпадает с именем объекта - serviceA;

+0

Я никогда не делаю этого, это требуется? Мой код отлично работает без него, я могу вызывать из контроллеров функции, подобные serviceA.someFunction(). Для переменной selectedItem у меня есть проблема. – Sam

+0

спасибо за редактирование. см. мой ответ, поскольку это сама служба, которую мне нужно было добавить в область. Таким образом, я могу привязать представление непосредственно к переменной службы, которая разделяется между контроллерами, т. Е. Если один контроллер изменяет это значение, представление, принадлежащее другому контроллеру, автоматически отобразит изменения. Не беспокойтесь о именах, я изменил их все на SO, но в моем реальном коде они названы по-разному. Спасибо за помощь! – Sam

0

Ах! Я заработал!

Выполнение:

<span>{{serviceA.selectedItem.value}}</span> 

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

angular.module('controllers').controller('someCtrl', 
['$scope', 'directDebitService', function ($scope, serviceA) { 
    $scope.serviceA= serviceA; 
}]); 

Работы хорошо сейчас.