角度范围是所有模块和控制器共享的

时间:2013-09-24 11:26:44

标签: javascript angularjs angularjs-directive angularjs-scope

我有一个单页应用程序,它有一个根模块,大约有5个单独的小模块。

var rootModule = angular.module('root', ["firstModule", "secondModule", "thirdModule"])

每个模块都有指令和控制器。今天我发现我可以从所有其他模块和控制器访问其他模块和控制器范围。

所以例如这个控制器:

thirdModule.controller('ThirdController', ['$scope', function ($scope) {
   alert($scope.title);
}

在这个控制器中,我警告变量并且它可以工作。

firstModule.controller('FirstController', ['$scope', function ($scope) {
   $scope.title = "Hello"
}

所以基本上我用ng-app="root"启动我的应用程序。这是正常的,一切都有共享范围,或者我的设置有问题吗?

我认为模块给我代码分离,控制器是新范围的单例。

2 个答案:

答案 0 :(得分:3)

没有看到HTML很难,但我猜你的控制器嵌套在html中?类似的东西:

<div ng-controller="FirstController">
  <div ng-controller="ThirdController">
  </div>
</div>

控制器在嵌套时使用原型继承。子进程从父进程继承并可以访问其作用域。因此,在这种情况下,ThirdController将能够从FirstController访问范围。如果他们在兄弟姐妹而不是嵌套的地方,那么ThirdController将无法访问FirstController。

这非常有用,但是如果你不知道这种继承是如何工作的话,你可以在这里找到一些问题,特别是当涉及继承对象和继承一个原语之间的区别时(这个)当我开始使用Angular时,我感到很困惑。

如果你愿意,我可以写一些关于它的更多内容,这确实是正在发生的事情,或者你可以看一下这个答案,了解更多有关原型继承的信息:What are the nuances of scope prototypal / prototypical inheritance in AngularJS?

此视频还演示了继承时对象和基元之间的区别:http://www.youtube.com/watch?v=DTx23w4z6Kc&feature=player_embedded

答案 1 :(得分:2)

每个模块(指令)都需要自己的(子)范围 - 隔离范围scope: {}或新范围scope: true,以防止跨范围问题。

示例:

// Create new scope:
var scope = $rootScope.$new();  // only one root per application
scope.salutation = 'Hello';
scope.name = 'World';

继承,在父范围中创建一个新的子范围

var parentScope = $rootScope;  // one root per application
var child = parentScope.$new();

parentScope.salutation = "Hello";
child.name = "World";

以下是有关范围的文档:

http://docs.angularjs.org/api/ng.$rootScope.Scope

以下是有关范围/继承的一些文档:

https://github.com/angular/angular.js/wiki/Understanding-Scopes

公平地说,我现在不认为自己是“angularjs”专家。