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