angular js如何在我的所有范围中使用集合

时间:2013-10-10 19:45:19

标签: angularjs

我有一个我需要在所有嵌套范围中访问的集合。在我的指令模板中,我的指令在ng-repeat ... n级别深。我不想说$ scope。$ parent。$ parent。$ parent .... $ parent.MyList。

我尝试过使用$ rootScope,但显然我不了解它是如何工作的。我在声明中将它传递给我的指令,如:

$rootScope.MyList = ["list": 1];
...
...
MyApp.directive('mydirective', ['$rootScope', function ($rootScope) { 
return {
   restrict:  'A',
   replace: false,
   link: function (scope, rootScope) {

}
}
}])

rootScope不包含MyList。有什么我做错了,还是更好的方法呢?我曾想过使用工厂或服务,但我不知道如何设置它,我们都知道Angular的文档有多糟糕,所以搜索非常令人沮丧。

3 个答案:

答案 0 :(得分:0)

你能提供一个plnkr或jsfiddle再现这种行为吗?我可以让控制器使用$rootScope与服务进行通信。 http://plnkr.co/edit/IEhOde

但是,您可能希望创建一个service,它会缓存您想要的值并将其注入您的指令并检索该值。

答案 1 :(得分:0)

首先$rootScope.MyList = ["list": 1]有语法错误,应为$rootScope.MyList = ["list", 1]$rootScope.MyList = [{"list": 1}]

您分配给$rootScope的任何内容都可以在$scopes内的子$rootScope内找到(隔离范围除外)。

通常,如果您想要在整个应用中分享内容,可以将其分配到AppCtrl,或者创建顶级$scope.MyList=...,其中包含AppCtrl等所有内容嵌套作用域可以访问它。第二个选项在可测试性方面要好一些,因为您可以将服务注入提供MyList数据的{{1}}。您可以在此处{$ 3}}查看此模式。

答案 2 :(得分:0)

建议使用服务/提供商。

对于数据列表,您可以使用值提供程序:

app.value('listService',  {  
   MyList : {"list": 1}
});  

将其注入您需要的地方,您可以将其包含在相关范围内:

app.controller('Ctrl', function($scope,listService) {
  $scope.list = listService.MyList;
});

一个小提琴:http://jsfiddle.net/qKcQL/

将其注入您需要的位置有助于记录和维护。但是如果你真的需要在全局$rootScope上使用它,那么这将实现:

app.controller('Ctrl', function($scope,listService,$rootScope) {
   $rootScope.list = listService.MyList;
});

$rootScope小提琴:http://jsfiddle.net/qKcQL/1/