角根范围和范围问题

时间:2014-10-31 22:10:19

标签: javascript angularjs rootscope

我注意到在我的一个控制器中,我注入了$ 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的评论,这就是我在巴塔朗看到的:

Batarang screenshot

ID为002的范围作为$ scope和$ rootScope传递给第一个控制器。将属性添加到$ scope时,它们会显示在$ rootScope上。然后所有其他控制器都在接收ID为00A的范围。因此,在这些控制器中添加到$ scope的属性对于获得$ scope注入的所有其他控制器是可见的。

1 个答案:

答案 0 :(得分:0)

$ rootScope和$ scope 不是相同的对象。

如果在根作用域中有一个名为 anObject 的对象,并且它具有名为 anAttribute 的属性;那么您可以使用$ scope来访问该属性,如下所示:

$scope.anObject.anAttribute

这是因为Angular在$ scope中找不到对象时会查找父作用域。

<强>更新

通过添加scope: true,您的mainNav指令应具有继承的子范围。 当“scope”为false(指令的默认设置)时,父控制器和指令的控制器共享同一范围对象。设置范围为true将为指令创建新的子范围。