2016-05-12 74 views
0

我试图从控制器修改全局值,并在另一个控制器上使用它,修改,但该变量保存旧值。从控制器修改全局值AngularJS

app.js

var app = angular.module('PressRoom', []); 
app.value('globals', 
    { 
     companyName: 'My company', 
     appName: 'My app', 
     user: { 
      name: 'Test user', 
      img: '', 
      role: '' 
     } 
    }); 

控制器,我想修改它

app.controller('LoginController', ['$scope','globals',function($scope,globals) 
{ 
    $scope.globals = globals; 
    globals.user.name = "Brand new user"; 
    // Redirect to dashboard. 
}]); 

控制器,我想使用它修改。

app.controller('DashboardController', ['$scope','globals',function($scope,globals,) 
{ 
    $scope.globals = globals; 
}]); 

在最后一个控制器的看法,我使用的是一个指令的全局值,但它显示测试的用户,而不是全新的用户

+0

你可以提供一个小提琴? –

+0

看来你不能重写提供者值.. [检查出来](http://stackoverflow.com/questions/27122761/how-to-override-change-angularjs-value-of-value-provider) – Vinay

+0

你可以“T。但你可以创建一个服务,有一个setter,getter;) – deadlock

回答

1

你不行。但是您可以创建一个具有getter和setter的Service,并以与使用值相同的方式使用它。不用说,你甚至可以把它变得更聪明一点,并创建一个服务,你可以用它作为关键的价值存储。例如,MyDataStore.set("myVal",1)MyDataStore.get("myVal")但为了简单起见,下面是一个简单的服务,演示了我的建议方法。

angular.module("my", []) 
    .service("MyValue", function() { 
    return { 
     set: function(val) { 
     this.val = val; 
     }, 
     get: function() { 
     return this.val; 
     } 
    } 
    }) 
    .run(function(MyValue) { 
    MyValue.set("Initial Value"); 
    }) 
    .controller("MyController", function(MyValue) { 
    console.log(MyValue.get()); //prints Initial Value 
    MyValue.set("New Value"); 
    console.log(MyValue.get()); //prints New Value 
    }) 

https://jsfiddle.net/oL0m2f7j/1/

0

使用$ rootScope变量,并宣布它的里面你工厂/服务(不在控制器中)

因此,您可以在应用程序中使用它,并且可以将该值复制到本地范围或在需要时覆盖它。

app.factory('MyFactory', MyFactory); 

function MyFactory() { 
    $rootScope.userName = ''; 
} 
app.controller('MyController', MyController); 

function MyController() { 
    $scope.desiredName = $rootScope.userName; 
    $scope.desiredName = 'Your desired value'; 
} 
+1

这有效,但使用$ rootScope在控制器之间共享数据并不被认为是一种好的做法。服务/工厂是首选方式。 – deadlock

+0

@deadlock是的..我们可以使用stateParams来捕获状态变化时的数据..? – Vinay

+1

是的,当然。状态无关,如果使用服务,则可以跨所有状态控制器使用它,而不必在每次状态更改时重复重新创建。 – deadlock