我正在開發一個項目,我需要從角度服務之外訪問服務。不幸的是,似乎從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上述代碼。
所以,就是抓住正確的噴油器的唯一途徑通過應用程序的DOM元素?如果我不知道哪個元素具有應用程序,或者有多個應用程序,該怎麼辦?/cc @calebboyd – joescii
也許將元素id(具有所需注入器的元素)傳遞到onclick處理程序(外部)並將其用於查詢和獲取所需的注入器。 – calebboyd
應用程序中的任何DOM元素都會執行。 – tasseKATT