3

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

我知道我可能可以使用服务来执行此操作并注入服务,但我希望可以分配某种 applevel 控制器。

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

有人对此有任何想法吗?

谢谢

4

2 回答 2

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;
        }
    }    
});

现在,您可以以分离的方式在父控制器上设置属性,而无需依赖范围层次结构。

于 2013-07-22T00:53:00.893 回答
1

当您在 Angular 中有一个子控制器时,它会从父范围继承。因此,如果您有一个顶级控制器包含某些后代控制器没有的功能,则将引用顶级功能(或范围对象)。如果其中一个子控制器定义了函数的本地版本(或作用域上的属性),那么它将不再从其父控制器继承。

小提琴:http: //jsfiddle.net/Y9yEQ/

的HTML

<div ng-app="myApp" ng-controller="TopLevelCtrl">
    <button ng-click="testing()">Yo top level!</button>
    <button ng-click="testing2()">Yo top level 2!</button>
    <div ng-controller="ChildCtrl">
        <button ng-click="testing()">Yo child!</button>
        <button ng-click="testing2()">Yo child2!</button>
    </div>
</div>

JS

angular.module("myApp",[]).controller("TopLevelCtrl", function($scope){
    $scope.testing = function() {
        alert("just testing");
    }
    $scope.testing2 = function() {
        alert("just testing parent");
    }
}).controller("ChildCtrl", function($scope){
    $scope.testing2 = function() {
        alert("just testing child");
    }
})

如果您需要在多个控制器之间共享一些数据(因为控制器实例可能会在添加/删除时创建或销毁以支持视图),您将需要使用服务。如果您的控制器有严格的结构,您可以 $emit 将事件冒泡到作用域或 $broadcast 通过作用域向下发送事件。

于 2013-07-19T03:31:11.450 回答