0

我注意到在我的一个控制器中,我正在注入 $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 看到的:

巴达朗截图

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

4

1 回答 1

0

$rootScope 和 $scope不是同一个对象。

如果您在根范围内有一个名为anObject的对象,并且它有一个名为anAttribute的属性;然后您可以像这样使用 $scope 访问该属性:

$scope.anObject.anAttribute

这是因为如果 Angular 在 $scope 中找不到对象,它会查找父范围。

更新:

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

于 2014-10-31T22:25:03.527 回答