隔离每个控制器的角度服务

时间:2015-09-14 22:05:08

标签: javascript angularjs

我使用Angular服务来放置我在任何地方使用的公共代码。它有效,但现在我发现了一些奇怪的东西!服务器中的变量在控制器之间共享,如果页面中有两个控制器,如果一个控制器更改变量,则会影响其他控制器。

但我不想要它!我需要一个像服务这样的系统,但每个控制器都有一个隔离的环境。有什么办法吗?

更新

app.service("myService",function(){
   this.variable = 1;
});

app.controller("loginCtrl",function($scope,myService){
    console.log(myService.variable); //prints 1
    myService.variable++;
});

app.controller("signupCtrl",function($scope,myService){
    console.log(myService.variable); //prints 2
});

我需要每个控制器使用一个新的myService(隔离)

1 个答案:

答案 0 :(得分:0)

AngularJS中的所有服务都是单身人士。因此,任何注入的单例都可能受到另一个控制器的影响。也就是说,您还可以有意创建一个注入服务的新实例,这将保证隔离范围,前提是您不要将共享服务注入到实例化服务中。

HTML:

<div ng-app="app">
    <div ng-controller="loginCtrl">
    </div>
    <div ng-controller="signupCtrl">
    </div>
</div>

JS:

var app = angular.module('app', []);

app.controller("loginCtrl", ['$scope', 'sharedService', function($scope, sharedService){
    var myService = sharedService.getInstance();
    console.log(myService.variable); //prints 1
    myService.variable++;
}]);

app.controller("signupCtrl", ['$scope', 'sharedService', function($scope, sharedService){
    var myService = sharedService.getInstance();
    console.log(myService.variable); //prints 1
}]);

app.factory('sharedService', [function () {
    return {
        getInstance: function () {
            return new instance();
        }
    }

    function instance () {
        this.variable = 1;
    }
}]);

Fiddle