AngularJS全局控制器

时间:2014-04-14 22:39:13

标签: javascript angularjs controllers

在我的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

}]);

这是controllers.js

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

});

我希望能够在我的应用程序中添加下载,因此我在$scope.addDownload = function() { ... }中写了DownloadsController。这将有效,但我希望能够在我的应用程序中的任何位置添加下载,这意味着无论我在哪个控制器中都调用addDownload()函数。

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

1 个答案:

答案 0 :(得分:10)

我可以推荐一些不同的方法。首先,即使在基于服务器端的MVC类型应用程序中,这也不会是全球性的#34;控制器,而不是面向方面的服务......或者#34;装饰器"。 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
     }
   }
}

然后在你的控制器中:

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

}])

使用此模式,您可以为新创建的工厂配置提供程序,以便在配置阶段设置configurableSetting,轻松地在模块或应用程序中添加常用功能,而无需在每次通话。

有关其工作原理的更多详细信息,请查看提供商的Angular开发人员指南:http://docs.angularjs.org/guide/providers