如何在Angular中使用$ rootScope来存储变量?

try*_*sis 215 angularjs angularjs-scope angularjs-controller rootscope

如何使用$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
});
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

Jas*_*son 247

通过原型继承,控制器范围可以使用在根范围设置的变量.

这是@ Nitish演示的修改版本,它显示了更清晰的关系:http: //jsfiddle.net/TmPk5/6/

请注意,在模块初始化时设置rootScope的变量,然后每个继承的范围都获得可以独立设置的自己的副本(change函数).此外,rootScope的值也可以更新(changeRs函数myCtrl2)

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;
    };
});
Run Code Online (Sandbox Code Playgroud)

  • 再加上1 ......呃......实际上回答了OP的问题.(虽然@MBielski和其他人是对的). (7认同)
  • @AllenLinatoc 不,它们不会是两个不同的对象,尽管“$rootScope”的范围是全局的(在所有控制器上),但“$scope”仍然是控制器的本地范围。如果您在两个不同的控制器中使用“$scope.test”,请知道它们是两个不同的变量,“$rootScope.test”是否在所有控制器中都是相同的变量 (2认同)

MBi*_*ski 161

在控制器之间共享数据是工厂/服务非常有用的.简而言之,它的工作原理是这样的.

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;
}
Run Code Online (Sandbox Code Playgroud)

你可以在这个小提琴中看到一个有效的例子:http://jsfiddle.net/mbielski/m8saa/

  • 好吧,Angular FAQ在页面底部说明了这一点:"相反,不要创建一个服务,其唯一目的就是存储和返回数据." 见:http://docs.angularjs.org/misc/faq (74认同)
  • +1当我们有服务和工厂之类的东西时,不应该使用`$ rootScope`来共享变量. (49认同)
  • 这是一个简单的例子.我相信他们说不要只有一个控制器出现服务.我无法计算开发Angular的员工有多少地方明确表示服务是在控制器之间传递数据的官方方式.浏览邮件列表,询问各种角度名人,看看你得到了什么.我可能还会注意到你的引用位于标题为"$ rootScope存在,但它可以用于邪恶"的部分的底部.将数据从一个控制器传递到另一个控制器是邪恶的 (11认同)

Nit*_*mar 21

angular.module('myApp').controller('myCtrl', function($scope, $rootScope) {
   var a = //something in the scope
   //put it in the root scope
    $rootScope.test = "TEST";
 });

angular.module('myApp').controller('myCtrl2', function($scope, $rootScope) {
   var b = //get var a from root scope somehow
   //use var b

   $scope.value = $rootScope.test;
   alert($scope.value);

 //    var b = $rootScope.test;
 //  alert(b);
 });
Run Code Online (Sandbox Code Playgroud)

DEMO


roc*_*ine 9

我没有理由这样做$ scope.value = $ rootScope.test;

$ scope已经是$ rootScope的原型继承.

请看这个例子

var app = angular.module('app',[]).run(function($rootScope){
$rootScope.userName = "Rezaul Hasan";
});
Run Code Online (Sandbox Code Playgroud)

现在,您可以将此范围变量绑定到app标记中的任何位置.


小智 6

首先将$ rootScope中的值存储为

.run(function($rootScope){
$rootScope.myData = {name : "nikhil"}
})

.controller('myCtrl', function($scope) {
var a ="Nikhilesh";
$scope.myData.name = a;
});

.controller('myCtrl2', function($scope) {
var b = $scope.myData.name;
)}
Run Code Online (Sandbox Code Playgroud)

$ rootScope是所有$ scope的父级,每个$ scope都会收到$ rootScope数据的副本,您可以使用$ scope本身访问这些数据.