在我的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()
函数的全局控制器,并且能够从我的所有控制器调用该函数吗?
答案 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