2013-08-28 128 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> 

即使selectedItem設置正確,跨度永遠不會更新。我究竟做錯了什麼 ?

+0

我分叉這撥弄幾個時間前到控制器之間的通信工作: http://jsfiddle.net/patxy/RAVFM/(抱歉,我不記得是誰第一個做的)。 這個小提琴使用一個事件來做到這一點($ scope.broadcast)。我建議你保持服務,並將此事件引入此服務 –

+0

我想避免使用廣播。事實上,angularjs中的服務是單例的,這就是爲什麼我想將它用於跨控制器的共享變量。我只使用廣播併發出指令 – Sam

回答

7

訪問該服務在你看來,你需要將其分配到的範圍:

$scope.serviceA = serviceA;

http://jsfiddle.net/MzJsZ/

+1

這很好。我也更新了演示來檢查我自己。 http://jsfiddle.net/MzJsZ/1/ – codef0rmer

+0

我已經發布了我自己的答案在你面前。但我會接受你的。 Thansk幫忙! – Sam

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

////工廠返回一個對象

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

    var selectedItem; 
    ... functions go here 

} 

}); 

工作的呢?你錯過了返回部分,那裏的一切都在那裏。如果你會使用服務,你只會寫this.serviceA = {...}

而你的代碼在控制器中缺少$ scope!

$scope.someItem= serviceA.selectedItem; 

或(我真的不知道自己想要什麼)你的跨度

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

$scope.serviceA.selectedItem= someItem;

然後(我真的不知道自己想要什麼)<span>{{serviceA.selectedItem.value}}</span>

PS我不喜歡你的控制器名稱與對象的一樣 - serviceA;

+0

我從來不這樣做,是否需要?我的代碼工作正常,沒有它,我可以從控制器調用像'serviceA.someFunction()'這樣的函數。這只是爲了selectedItem變量,我有一個問題。 – Sam

+0

感謝您的編輯。看到我的答案,因爲它是我需要添加到範圍內的服務本身。這樣,我可以將視圖直接綁定到服務變量,這個變量在控制器之間共享,即:如果一個控制器修改該值,屬於另一個控制器的視圖將自動顯示更改。不要擔心名字,我已經改變了它們,但是在我的真實代碼中,它們的命名方式不同。感謝您的幫助! – Sam

0

啊!我得到它的工作!

這樣做:

<span>{{serviceA.selectedItem.value}}</span> 
的觀點,因爲雖然serviceA在視圖中的控制器注入,我沒有把它分配給範圍將無法正常工作

...所以正確的方法是做到這一點的控制器:

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

現在工作正常。

相關問題