AngularJS:AppLevel控制器可能吗?

Mar*_*tin 3 angularjs angularjs-scope

我有一个控制器是我的页面的控制器,但我想知道它是否可能有一个AppLevel控制器,即可以从每个页面访问的东西......所以每个页面实际上将分配多于1个控制器.

我知道我可以通过服务和注入服务来做到这一点,但我希望能够分配某种类型的applevel控制器.

如果这可能,我将如何在2之间进行通信?我假设使用依赖注入,只是将applevel控制器传递给我的主页面?

有人对此有所了解吗?

谢谢

bre*_*ick 5

AngularJS利用JavaScript原型继承,以便范围访问父作用域上的属性.您可以定义嵌套在HTML中的控制器,并从子级访问父级.但是我强烈建议你不要依赖这个'AppCtrl'这个事实.在某些情况下,您正在处理的作用域将被隔离,并且不会成为可以访问AppCtrl作用域的继承层次结构的一部分.

我建议为此创建一个服务,或者你可以使用pub/sub和$ rootScope.$ on和$ rootScope.$ broadcast.

为了显示服务示例,我将使用shellCtrl和shell service而不是app来使示例更清晰.

'shell'服务的工作是允许应用程序中的任何其他控制器,指令或服务与shellController进行交互,从而与主机视图容器进行交互.

<div ng-app="myApp" ng-controller="ShellCtrl">
    <div ng-controller="SomeOtherCtrl"></div>
</div>

// parent controller defined on the same element as ng-app
function ShellCtrl($scope, shell) {
    // I've just made the shell accessible to the $scope of shellctrl, but you can do
    // this in various ways.
    $scope.shell = shell;
}

// any other controller
function SomeOtherCtrl($scope, shell) {
    shell.setTitle('Some title');
}

// basic example of the shell service
angular.module('myApp').factory('shell', function () {
    return {
        title = 'No title set',
        setTitle = function (title) {
            this.title = title;
        }
    }    
});
Run Code Online (Sandbox Code Playgroud)

现在,您可以在不依赖于作用域层次结构的情况下以分离的方式在父控制器上设置属性.