javascript - 为什么从外部 Angular 调用的服务不是单例?

标签 javascript angularjs

我正在开发一个项目,我需要从 Angular 服务外部访问服务。不幸的是,从 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。 “内部”按钮继续按预期增加单个服务。

我应该从外部 Angular 访问服务以获取服务的单例实例吗?

Here is a fiddle上面的代码。

最佳答案

Angular 中的服务是单例,因为每个注入(inject)器仅创建一次服务。

angular.injector 但是创建了一个新的注入(inject)器函数。

您需要获取当前应用程序注入(inject)器:angular.element(domElement).injector()

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

内部保持同步的演示:http://jsfiddle.net/kW2BC/

关于javascript - 为什么从外部 Angular 调用的服务不是单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23461652/

相关文章:

javascript - stenciljs 观察装饰器未触发

javascript - 在angular js中从web api下载csv文件

javascript - 在 AngularJS 中按名字的首字母过滤人员列表

javascript - 将Vue组件绑定(bind)到vue实例

javascript - 如何将参数传递给过滤器方法并使用不同的参数在 React onClick 事件中调用该函数?

javascript - 为什么在 redux 中使用不可变数据结构时选择器总是返回不可变的?

javascript - AngularJS:面板和内部链接上的 ui-sref

javascript - JQuery 未捕获类型错误

javascript - 如何将 AngularJS 范围对象转换为简单的 JS 数组?

javascript - 在 javascript 中读取本地 xls/xlsx 文件