以javascript / angular扩展对象

时间:2014-11-12 06:10:14

标签: javascript angularjs

所以我在我的角应用程序中有一个树辅助对象,它提供了许多有用的函数来处理应用程序中的许多树结构。这是由工厂提供的,所以每次某个控制器(或其他)请求树帮助器时,它都会获得自己的副本:

angular.module('MainApp').factory('TreeHelperFactory', 
function ($http, $q, $filter, DataService) {
    var treeHelper = new function ($http, $q, $filter, DataService) {
    ...
    code
    ...
})

现在我有了一个类别服务,它提供了各种与类别相关的功能,包括返回一个类别树并提供操作该树的方法。所以像OO开发人员一样思考,我认为类别服务实际上就像我的树帮助器的子类,所以我注入了一个树帮助器实例,然后尝试使用类别特定的函数扩展该实例,天真地像这样:

angular.module('MainApp').provider('CategoryService',
function() {
    this.$get = function ($http, $q, $filter, DataService, TreeHelperFactory) {
        var catService = TreeHelperFactory; 
        catService.listCategories = function() {...}
        catService.deleteCategory = function(id) {...}
        ... more code...
        return catService;
        }  
    }
);

但这不起作用。当我稍后尝试调用它们时,新属性不可见,只有原始工厂对象的树辅助属性。我错过了什么以及如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

angular.js中的服务是单例,这意味着每次注入服务时它都返回完全相同的对象,每次注入时都不能强制它返回一个新对象。

您可以做的是创建Class功能,例如:

angular.module('MainApp')

.factory('TreeHelperFactory', 
function ($http, $q, $filter, DataService) {

    /**
     * TreeHelper constructor
     * @class    
     */
    function TreeHelper() { /* this.init(); */ }

    /**
     * TreeHelper static class method
     */
    TreeHelper.list = function() { /* ... */ };

    /**
     * TreeHelper instance method
     */
    TreeHelper.prototype.init = function() { /*...*/ };

    /**
     * Returns the class
     */
    return TreeHelper;
})

现在你可以注入它,实例化一个对象并像这样扩展它:

.factory('CategoryService', function (TreeHelperFactory) {

  var catService = new TreeHelperFactory();

  catService.listCategories = function() { /*...*/ };
  catService.deleteCategory = function(id) { /*...*/ };

  return catService;
});

您也可以使用javascript prototypical inheritance,但我认为这对大多数情况来说都是过度杀伤,所以如果可以,请保持简单。

答案 1 :(得分:0)

依赖于Angular服务的助手对我来说是一种难闻的气味 - 几乎就像它的状态不仅仅是帮助者而且它有一两个服务。你能通过重组他们的角色和责任来重新思考这个吗?