2014-05-04 17 views
0

我正在開發一個項目,我需要從角度服務之外訪問服務。不幸的是,似乎從angular外部檢索的服務與應用程序內部的實例不同。實際上,每次我調用它時都是一個新實例。我在下面創建了一個示例來演示問題。爲什麼從外部角度調用的服務不是單身?

<div ng-controller="controller"> 
    <div> 
     <span ng-bind="count"></span> 
     <input type="button" value="Inside" ng-click="inc()"></input> 
    </div> 
    <div> 
     <span id="outside-count">0</span> 
     <input type="button" value="Outside" onclick="outside()"></input> 
    </div> 
</div> 

和JavaScript ...

angular.module('Services', []) 
.service('svc', function() { 
    var svc = { 
     count: 0, 
     increment: function(){svc.count++;} 
    }; 
    return svc; 
}); 

angular.module('MyApp', ['Services']) 
.controller('controller', ['$scope', 'svc', function($scope, svc) { 
    $scope.count = svc.count; 
    $scope.inc = function() { 
     svc.increment(); 
     $scope.count = svc.count; 
    }; 
}]); 

var outside = function() { 
    var svc = angular.injector(['ng', 'Services']).get('svc'); 
    svc.increment(); 
    angular.scope().$apply(); 
    document.getElementById('outside-count').innerHTML = svc.count; 
}; 

我想到的是外面計數按鈕將增加相同的服務對象,因爲我在ng-controller得到。但是,每次都會得到一個新實例,因爲連續點擊按鈕總是顯示1。 「內部」按鈕繼續按預期遞增單個服務。

有沒有不同的方式,我應該從外部角度訪問服務來獲取服務的單例實例?

Here is a fiddle上述代碼。

回答

3

Angular中的服務是單一的,因爲它們只在每個注入器創建一次。

angular.injector但是創建了一個新的注射器功能。

你需要獲得當前應用程序注入:angular.element(domElement).injector()

演示http://jsfiddle.net/BsLK8/

演示,其中內部滯留同步http://jsfiddle.net/kW2BC/

+0

所以,就是抓住正確的噴油器的唯一途徑通過應用程序的DOM元素?如果我不知道哪個元素具有應用程序,或者有多個應用程序,該怎麼辦?/cc @calebboyd – joescii

+0

也許將元素id(具有所需注入器的元素)傳遞到onclick處理程序(外部)並將其用於查詢和獲取所需的注入器。 – calebboyd

+0

應用程序中的任何DOM元素都會執行。 – tasseKATT

2

您正在從這些模塊創建一個新的注入器,這就是爲什麼您要獲得所請求服務的新實例。相反,您需要獲取屬於具有所需數據/實例的元素的當前注入器。要做到這一點使用此:

//assuming ng-app='MyApp' is on the html tag 
//otherwise pass in the correct element. 
var svc = angular.element(document).injector().get('svc'); 
相關問題