我对Angular很新。对不起基本问题,但我找不到有关如何以正确的方式在Angular中编写库的信息。
原因是受益于Angular模块以及可测试性/模拟。
我正在将我的代码转移到Angular,但我的代码的很大一部分是基于我在几个月内开发的库编写的。想象一下像下划线。
所以我最初的想法是将它包装在角度模块中,如:
angular.module('mylib', [])
.factory('map', map)
.factory('reduce', reduce)
.factory('find', find);
function map (...
每个工厂功能都是可测试的东西。然后使用它:
angular.module('app', ['mylib'])
.controller('MainCtrl', ['$scope', 'map', MainCtrl]);
function MainCtrl($scope, map) {
... do stuff with map ...
这对于我猜的几个函数来说很好,但是我的库有20多个函数,并且它太多样板来将它们中的每一个定义为工厂,然后将它们注入我的控制器。
另一种方法是只有一个工厂返回一个对象。有点像这样:
angular.module('mylib', [])
.factory('mylib', mylib)
function mylib () {
var exports = {};
exports.map = function (...
exports.reduce = function (...
exports.find = function (...
return exports;
}
然后像这样使用它:
angular.module('app', ['mylib'])
.controller('MainCtrl', ['$scope', 'mylib', MainCtrl]);
function MainCtrl($scope, mylib) {
... do stuff with mylib.map ...
这是一个好方法吗?在Angular中编写实用程序库并使用它的好方法是什么?可读性和可维护性很重要,但我不希望有太多的样板代码。
答案 0 :(得分:4)
如果您的库函数与您的示例一样通用,我首先不会尝试将它们定义为Angular模块。写一个普通的JS库。这将导致更少的无用样板,作为奖励,您的库也可用于非Angular应用程序。 Angular很好地与不知道它的库一起玩,例如,不要求数据对象实现额外的任何东西(想象ko.observable
,Backbone Model
等)以便与数据绑定一起使用。
作为Angular模块不是可测试性的要求。我唯一可以想到的是,Angular可以提高通用实用程序库中的可测试性是依赖注入(例如,将模拟服务注入"当前时间"进入时间库以获得确定性结果)。如果您不需要其中任何一项,请使用过去最少的复杂功能,然后编写一个普通的JS库。
如果将文件库包装在Angular模块中是绝对必要的(例如,为了不使用短命名空间污染全局命名空间),我仍然会在普通JS中编写库,将其放入更复杂的命名空间,然后使用Angular模块对其进行别名。
LIB /手持公用事业-1.0.js
// Or any other descriptive namespace
var handyUtilities = {
map: function() { ... }
};
应用程序/ util.js中
angular.module("handyUtilities", []).constant("util", handyUtilities);