0

我有一个需要在所有嵌套范围内访问的集合。在我的指令模板中,在 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 的文档有多么糟糕,所以搜索非常令人沮丧。

4

3 回答 3

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/

于 2013-10-10T21:32:23.690 回答
0

您能否提供重现此行为的 plnkr 或 jsfiddle?我可以让控制器使用$rootScope. http://plnkr.co/edit/IEhOde

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

于 2013-10-10T19:53:35.150 回答
0

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

由于原型继承,您分配的任何内容$rootScope都可以在子级(隔离范围除外)中访问。$scopes

通常,如果您想在整个应用程序中共享某些内容,您可以将其分配给您,或者您可以创建具有类似内容的$rootScope顶层,并且所有嵌套范围都可以访问它。第二个选项在可测试性方面要好一些,因为您可以注入提供数据的服务。您可以在AngularJS GlobalCtrl vs $rootScope vs Service中看到这种模式的实际应用。AppCtrl$scope.MyList=...AppCtrlMyList

于 2013-10-10T19:53:45.153 回答