我注意到在我的一个控制器中,我注入了$ rootScope和$ scope,它们都指向同一个对象。
此外,在我的所有其他控制器中,$ scope对象是共享的。因此,每当我注入范围时,它都包含在迄今为止已实例化的所有其他控制器中分配给它的属性/方法。
这不是我从一开始就开始工作的应用程序,而且非常庞大。我以前没见过这种行为,我不知道从哪里开始诊断它。是什么原因引起了这个?
我们设置控制器/指令的方式非常标准,看起来像这样:
angular.module('myApp')
.directive('mainNav', function() {
return {
restrict: 'A',
templateUrl: 'scripts/directives/mainNav/mainNav.html',
controller: 'mainNavCtrl',
replace: true,
link: function(scope, element) {
//Do DOM-related stuff
});
}
};
})
.controller('mainNavCtrl', function($rootScope, $scope, $state) {
//Do controller stuff
});
我们还按如下方式配置我们的应用程序:
angular.module('myApp',['ui.router','kendo.directives'])
.config(function($ stateProvider,$ urlRouterProvider){ $ urlRouterProvider.otherwise( '/');$stateProvider .state('app', { url: '/', templateUrl: 'views/app.html', resolve: { //Fetch stuff } }) ; });
回应Kursad Gulseven的评论,这就是我在巴塔朗看到的:
ID为002的范围作为$ scope和$ rootScope传递给第一个控制器。将属性添加到$ scope时,它们会显示在$ rootScope上。然后所有其他控制器都在接收ID为00A的范围。因此,在这些控制器中添加到$ scope的属性对于获得$ scope注入的所有其他控制器是可见的。
答案 0 :(得分:0)
$ rootScope和$ scope 不是相同的对象。
如果在根作用域中有一个名为 anObject 的对象,并且它具有名为 anAttribute 的属性;那么您可以使用$ scope来访问该属性,如下所示:
$scope.anObject.anAttribute
这是因为Angular在$ scope中找不到对象时会查找父作用域。
<强>更新强>
通过添加scope: true
,您的mainNav指令应具有继承的子范围。
当“scope”为false(指令的默认设置)时,父控制器和指令的控制器共享同一范围对象。设置范围为true将为指令创建新的子范围。