我正在使用 Angular 迈出第一步,我需要定义一个实用程序帮助库,其中包含几个函数方法,例如
dataHelper.parse
, dataHelper.sanitize
, 等
以角度组织它的推荐方法是什么?
我正在使用 Angular 迈出第一步,我需要定义一个实用程序帮助库,其中包含几个函数方法,例如
dataHelper.parse
, dataHelper.sanitize
, 等
以角度组织它的推荐方法是什么?
对于实用方法,我会将它们组织在 Angular 框架之外的库中,但对 angular.extend 的依赖性很小。如果你希望你的库完全独立于 Angular,你可以extend
用你自己的实现来替代。
将您的实用程序 API 包装在一个 JavaScript 附件中,并将您的库作为一个属性公开window
(在下面的示例中,我将库命名为myLibrary,但您可以自由选择您喜欢的任何名称)。通过将您的库作为 的属性附加window
,您将能够无条件引用“myLibrary”。如果您好奇,这正是angular库的公开方式。
(function (window, document) {
'use strict';
// attach myLibrary as a property of window
var myLibrary = window.myLibrary || (window.myLibrary = {});
// BEGIN API
function helloWorld() {
alert('hello world!');
}
function utilityMethod1() {
alert('Utility Method 1');
}
function utilityMethod2() {
alert('Utility Method 2');
}
// END API
// publish external API by extending myLibrary
function publishExternalAPI(myLibrary) {
angular.extend(myLibrary, {
'helloWorld': helloWorld,
'utilityMethod1': utilityMethod1,
'utilityMethod2': utilityMethod2
});
}
publishExternalAPI(myLibrary);
})(window, document);
用法
添加脚本后,您可以从任何地方使用您的库 - 服务、工厂、提供程序、控制器、指令等。
<script type='text/javascript' src='angular.js'></script>
<script type='text/javascript' src='myLibrary.js'></script>
<script>
myLibrary.helloWorld();
myLibrary.utilityMethod1();
myLibrary.utilityMethod2();
</script>
实用程序库与 Angular 服务
我更喜欢实用程序函数驻留在自己的库中而不是 Angular 服务中的原因是因为我认为它们与 Angular 生态系统是分开的。这些实用功能几乎是独立的,并且与模块无关,而 Angular 服务/工厂与 Angular 的其他部分(包括控制器和指令)密切合作,并且与模块密切相关。
扩展角度
如果你真的想要,你甚至可以扩展 Angular 库本身。只需在脚本中替换myLibrary
为angular
(注意:这可能是不可取的,因为它会使您的脚本依赖于 Angular 实现)。
创建自定义服务
globalModule.service('toolkit',function(){
return{
getDate: function(altFormat){
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth()+1; //January is 0!
var yyyy = today.getFullYear();
if(dd<10){dd='0'+dd} if(mm<10){mm='0'+mm} today = yyyy +'-'+ mm+'-'+dd;
if(altFormat){
today = today.replace(/-/g, '.');
}
return today;
},
/**
* Returns a 32 character ID [ XXXXXXXX - XXXXXXXXXXXXXXXXXXXXXXXX ]
* @returns {string}
*/
newGUID: function(){
// ...
}
};
});
您可以在任何需要的地方注入它。如果您可以将一些逻辑捆绑到单独的服务中(例如parseService
),我认为您应该这样做。
如果您需要更灵活或可配置的东西,请查看提供程序。
要扩展 @pixelbits 的答案,如果您想明确外部依赖项,您可以相当轻松地包装现有库以与 Angular 一起使用,例如momentjs:
angular.module('testApp')
.constant( 'moment', moment)