我有一个控制器,它是我的页面的控制器,但我想知道是否有可能拥有一个 AppLevel 控制器,即可以从每个页面访问的东西......所以每个页面实际上都会分配超过 1 个控制器。
我知道我可能可以使用服务来执行此操作并注入服务,但我希望可以分配某种 applevel 控制器。
如果可能的话,我将如何在 2 之间进行通信?我假设使用依赖注入并将 applevel 控制器传递到我的主页?
有人对此有任何想法吗?
谢谢
我有一个控制器,它是我的页面的控制器,但我想知道是否有可能拥有一个 AppLevel 控制器,即可以从每个页面访问的东西......所以每个页面实际上都会分配超过 1 个控制器。
我知道我可能可以使用服务来执行此操作并注入服务,但我希望可以分配某种 applevel 控制器。
如果可能的话,我将如何在 2 之间进行通信?我假设使用依赖注入并将 applevel 控制器传递到我的主页?
有人对此有任何想法吗?
谢谢
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;
}
}
});
现在,您可以以分离的方式在父控制器上设置属性,而无需依赖范围层次结构。
当您在 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 通过作用域向下发送事件。