Javascript 角度根范围和范围问题
我注意到在我的一个控制器中注入了$rootScope和$scope,它们都指向同一个对象 此外,在我的所有其他控制器中,$scope对象是共享的。因此,每当我注入作用域时,它都会在所有其他已实例化的控制器中包含分配给它的属性/方法 这不是我从一开始就开发的一个应用程序,它非常庞大。我以前从未见过这种行为,我不知道从哪里开始诊断它。你知道这是什么原因吗 我们设置控制器/指令的方式非常标准,如下所示:Javascript 角度根范围和范围问题,javascript,angularjs,rootscope,Javascript,Angularjs,Rootscope,我注意到在我的一个控制器中注入了$rootScope和$scope,它们都指向同一个对象 此外,在我的所有其他控制器中,$scope对象是共享的。因此,每当我注入作用域时,它都会在所有其他已实例化的控制器中包含分配给它的属性/方法 这不是我从一开始就开发的一个应用程序,它非常庞大。我以前从未见过这种行为,我不知道从哪里开始诊断它。你知道这是什么原因吗 我们设置控制器/指令的方式非常标准,如下所示: angular.module('myApp') .directive('mainNav', f
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
});
$scope.anObject.anAttribute
我们也会按照以下方式配置我们的应用程序:
angular.module('myApp',['ui.router','kendo.directives']).config(函数($stateProvider,$urlRouterProvider){ $urlRouterProvider。否则('/') 作为对库尔萨德·古尔塞夫评论的回应,我在巴塔朗看到的是:
ID为002的作用域作为$scope和$rootScope传递给第一个控制器。当属性添加到$scope时,它们显示在$rootScope上。然后所有其他控制器都接收ID为00A的作用域。因此,在这些控制器中添加到$scope的属性对所有其他注入$scope的控制器可见。$rootScope和$scope不是同一个对象 如果在根作用域中有一个名为anObject的对象,并且它有一个名为anAttribute的属性,则可以使用$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
});
$scope.anObject.anAttribute
这是因为Angular在$scope中找不到对象时会查找父作用域
更新:
通过添加scope:true
,mainNav指令应该具有继承的子作用域。
当“范围”为false,这是指令的默认设置,父控制器和指令的控制器共享同一个scope对象。将scope设置为true将为指令创建一个新的子作用域。子作用域继承其父作用域的属性,除非被重写。可能就是这样。我注意到的是,rootScoped范围都具有相同的ID(在本例中为002)。另外,当我在控制器中向作用域添加属性时,它们也会显示在根作用域上。不像根作用域上的子属性,而是根作用域本身。你在Batarang作用域树上看到了什么?一个id为002的单一作用域或多个嵌套作用域都有id为002?我说得很简单,但是你在代码中搜索过类似的内容吗e将根作用域分配给作用域,例如,
$scope=$rootScope
?不,最接近的是$scope=$rootScope.$new()在一些单元测试中,这显然不是同一件事。这看起来很奇怪。也许你的mainNav
指令应该通过添加scope:true
来继承子作用域。我不知道你的代码中到底发生了什么。如果继承的作用域不起作用,那么我会要求你创建一个模拟你的问题的小提琴。