我有一个基类,我想在服务中扩展,以帮助将数据输入到角度范围.我在网上寻找解决方案,但没有找到我喜欢的解决方案.我有一个基类,用于访问设备的文件系统
班级结构:
var cOfflineStorageBase = Class.extend({ init: function(){ },CreateFolderDir: function(){ },DeleteAll: function(){ },DeleteDirectories: function(){ },DeleteItem: function(){ },GetFiles: function(){ },FileExists: function(){ },GetPath: function(){ },GetObject: function(){ },SaveObject: function(){ },});
我希望能够在几个不同的角度服务(即offlineCart,offlineCustomLists等)中扩展此类,其中每个服务都能够使用存储库来存储各种不同的数据类型.我正在寻找最好,最合适的方式来做角度.在vanilla JavaScript中,你可以这样做:
var newClass = cOfflineStorageBase.extend({ //add new stuff here });
但我想以棱角分明的方式做同样的事情.
我一直在考虑的方法是使用angular.extend功能,但我不确定这是否合适,或者这样的事情是更合适的方法:
app.factory('someChild',['$http','cOfflineStorageBase',function($http,cOfflineStorageBase){ var SomeClass = cOfflineStorageBase.extend({ init: function(){ this._super.init() },//Add more stuff here }); return SomeClass; }]);
如果这些方法是正确的,或者如果可能有另一个对我想要完成的事情更好,我想要一些建议.我还想或者更愿意在大部分代码中使用promises,因为它会是异步的.
解决方法
我最近推出了这个技巧.
我将从定义一个纯JavaScript构造函数开始.这不需要是角度服务.我所做的是,后来,扩展构造函数可以通过参数传递任何必要的注入.所以,这将是我的角度服务的基础“类”.这是我要暴露任何我希望所有角度服务继承的地方.
function ParentService($http) { this.$http = $http; } ParentService.prototype.foo = function () { alert("Hello World"); };
然后我将继续使用原型继承来定义子构造函数.这个构造函数确实是一个有角度的服务(你可以告诉我最后使用$inject).
function ChildService($http) { Parent.call(this,$http); } ChildService.prototype = new ParentService(); ChildService.prototype.baz = function() { return this.$http.get('/sample/rest/call'); } ChildService.$inject = ['$http'];
然后我将在相应的角度模块中注册点菜服务:
var app = angular.module('SampleApp',[]); app.service('child',ChildService);
最后,在我的控制器中,我将简单地注入我的服务,这将是我的ChildService构造函数的一个实例,它反过来扩展了我的ParentService构造函数:
app.controller('MainCtrl',['$scope','child',function ($scope,child) { child.foo(); //alert("Hello World") var promise = child.bar(); }]);
你可以看到一个JSFiddle here
还有来自ngConf的Youtube中有一个有趣的视频,名为Writing A Massive Angular App,其中包含了一些关于角度代码可重用性的主题和其他一些想法.