如何在angular中创建一个utils库

时间:2014-10-20 17:56:16

标签: javascript angularjs

我对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中编写实用程序库并使用它的好方法是什么?可读性和可维护性很重要,但我不希望有太多的样板代码。

1 个答案:

答案 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);