我如何使用$rootScope存储变量在一个控制器,我想以后在另一个控制器访问?例如:
angular.module('myApp').controller('myCtrl', function($scope) {
var a = //something in the scope
//put it in the root scope
});
angular.module('myApp').controller('myCtrl2', function($scope) {
var b = //get var a from root scope somehow
//use var b
});
我该怎么做呢?
有多种方法来实现这一点:-
1. 在.run方法中添加$rootScope
.run(function ($rootScope) {
$rootScope.name = "Peter";
});
// Controller
.controller('myController', function ($scope,$rootScope) {
console.log("Name in rootscope ",$rootScope.name);
OR
console.log("Name in scope ",$scope.name);
});
2. 创建一个服务并在两个控制器中访问它。
.factory('myFactory', function () {
var object = {};
object.users = ['John', 'James', 'Jake'];
return object;
})
// Controller A
.controller('ControllerA', function (myFactory) {
console.log("In controller A ", myFactory);
})
// Controller B
.controller('ControllerB', function (myFactory) {
console.log("In controller B ", myFactory);
})
在控制器之间共享数据是工厂/服务非常擅长的。简而言之,它是这样工作的。
var app = angular.module('myApp', []);
app.factory('items', function() {
var items = [];
var itemsService = {};
itemsService.add = function(item) {
items.push(item);
};
itemsService.list = function() {
return items;
};
return itemsService;
});
function Ctrl1($scope,items) {
$scope.list = items.list;
}
function Ctrl2($scope, items) {
$scope.add = items.add;
}
你可以在这个小提琴中看到一个工作的例子:http://jsfiddle.net/mbielski/m8saa/
在根作用域设置的变量通过原型继承可用于控制器作用域。
以下是@Nitish演示版本的修改版本,可以更清楚地显示两者之间的关系:
http://jsfiddle.net/TmPk5/6/
注意,rootScope的变量是在模块初始化时设置的,然后每个继承的作用域都有自己的副本,可以独立设置(change函数)。同样,rootScope的值也可以更新(myCtrl2中的changeRs函数)
angular.module('myApp', [])
.run(function($rootScope) {
$rootScope.test = new Date();
})
.controller('myCtrl', function($scope, $rootScope) {
$scope.change = function() {
$scope.test = new Date();
};
$scope.getOrig = function() {
return $rootScope.test;
};
})
.controller('myCtrl2', function($scope, $rootScope) {
$scope.change = function() {
$scope.test = new Date();
};
$scope.changeRs = function() {
$rootScope.test = new Date();
};
$scope.getOrig = function() {
return $rootScope.test;
};
});