所以我在我的角应用程序中有一个树辅助对象,它提供了许多有用的函数来处理应用程序中的许多树结构。这是由工厂提供的,所以每次某个控制器(或其他)请求树帮助器时,它都会获得自己的副本:
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;
}
}
);
但这不起作用。当我稍后尝试调用它们时,新属性不可见,只有原始工厂对象的树辅助属性。我错过了什么以及如何实现这一目标?
答案 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服务的助手对我来说是一种难闻的气味 - 几乎就像它的状态不仅仅是帮助者而且它有一两个服务。你能通过重组他们的角色和责任来重新思考这个吗?