AngularJS全局控制器

Joh*_*ean 4 javascript controllers angularjs

在我的Angular应用程序中,我有一些函数,我认为应该在全局控制器中.在服务器端MVC框架中,通常有一个全局控制器,所有其他控制器都扩展,这是我放置这些功能的地方.我想知道Angular是否有类似的东西.

所以目前我有这个app.js:

'use strict';

// Declare app level module
var app = angular.module('app', ['ngRoute']).config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {

    // Possible routes can go here

}]);
Run Code Online (Sandbox Code Playgroud)

这个在controllers.js:

app.controller('DownloadsController', function ($scope) {

});
Run Code Online (Sandbox Code Playgroud)

我希望能够在我的应用程序中添加下载,所以我写$scope.addDownload = function() { ... }DownloadsController.这将有效,但是我希望能够在我的应用程序中的任何地方添加下载,这意味着addDownload()无论我在哪个控制器中调用该函数.

我可以定义一个包含该addDownload()功能的全局控制器,并能够从我的所有控制器调用该功能吗?

Bri*_*sch 10

我可以推荐几种不同的方法.首先,即使在基于服务器端的MVC类型应用程序中,这也不是"全局"控制器,而是面向方面的服务......或"装饰器".Angular在这方面确实没有什么不同,因为您可以使用所需的功能来装饰您的范围.你在这里的选择是:

  • 创建下载指令
  • 创建下载提供程序/服务/模型
  • 使用装饰器扩展范围,将方法添加到所有控制器

根据您需要如何调用此功能,将确定您开发此功能的方法.最强大和最便携的,就是创建自己的模块,并注册一个供应商,这是该功能的工厂.这样您就可以轻松地将功能注入您选择的任何控制器中,并在您的模块或应用程序中配置一些常用设置:

myApp.provider('download', function DownloadProvider() {
  var configurableSetting = false;

  this.setConfigurableSetting = function(value) {
    configurableSetting = !!value;
  };

  this.$get = ["customArgument", function addDownload(customArgument) {

    return new Download(customArgument, configurableSetting);
  }];
});

function Download(customArgument, configurableSetting){
  //download code
  return {
     addDownload:function(){
        //code for method
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中:

app.controller('whatever',['download',function(download){
      var download1 = download(); //creates a new download instance
      download.addDownload(); //executes method available on function

}])
Run Code Online (Sandbox Code Playgroud)

使用这种模式,您可以配置为新建工厂提供,这样你可以设置您configurableSetting在配置阶段,很容易添加在您的模块或应用程序的通用功能,而不必在每次调用明确定义它.

有关其工作原理的更多详细信息,请查看Angular Developer指南:http://docs.angularjs.org/guide/providers