栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否可以以良好的形式重用Angular中的相同数据工厂?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否可以以良好的形式重用Angular中的相同数据工厂?

就我个人而言,我希望代码保持干燥状态,并且发现,如果在服务器API上保持通用约定,则可以使用基本工厂/存储库/类或任何您想调用的名称走很长一段路。我在AngularJs中实现此目标的方法是使用AngularJs工厂,该工厂返回基本存储库类,即工厂返回带有原型定义而不是对象实例的javascript类函数,我称之为

abstractRepository
。然后,针对每个资源,为该典型资源从原型继承的具体资源创建一个具体的存储库
abstractRepository
,因此我继承了所有共享/基本功能,
abstractRepository
并为具体存储库定义了任何资源特定的功能。

我认为一个例子会更清楚。假设您的服务器API使用以下URL约定(我不是最纯REST的人,所以我们将把约定留给您要实现的任何约定):

GET  -> /{resource}?listQueryString     // Return resource listGET  -> /{resource}/{id}     // Return single resourceGET  -> /{resource}/{id}/{resource}view // Return display representation of resourcePUT  -> /{resource}/{id}     // Update existing resourcePOST -> /{resource}/         // Create new resourceetc.

我个人使用Restangular,因此以下示例基于该示例,但是您应该可以轻松地将其调整为

$http
$resource

abstractRepository

app.factory('abstractRepository', [function () {    function abstractRepository(restangular, route) {        this.restangular = restangular;        this.route = route;    }    abstractRepository.prototype = {        getList: function (params) { return this.restangular.all(this.route).getList(params);        },        get: function (id) { return this.restangular.one(this.route, id).get();        },        getView: function (id) { return this.restangular.one(this.route, id).one(this.route + 'view').get();        },        update: function (updatedResource) { return updatedResource.put();        },        create: function (newResource) { return this.restangular.all(this.route).post(newResource);        }        // etc.    };    abstractRepository.extend = function (repository) {        repository.prototype = Object.create(abstractRepository.prototype);        repository.prototype.constructor = repository;    };    return abstractRepository;}]);

具体的存储库,让我们以客户为例:

app.factory('customerRepository', ['Restangular', 'abstractRepository', function (restangular, abstractRepository) {    function customerRepository() {        abstractRepository.call(this, restangular, 'customers');    }    abstractRepository.extend(customerRepository);    return new customerRepository();}]);

然后在您的控制器中注入

customerRepository

app.controller('CustomerController', ['$scope', 'customerRepository', function($scope, customerRepository) {    // Use your customerRepository}]);

如果使用这种基本存储库模式,您会发现大多数CRUD控制器也将共享许多通用代码,因此我通常会创建一个基本CRUD控制器,我的控制器使用继承该基本CRUD控制器

$injector.invoke
,但我将保留以下示例这超出了这个问题的范围。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/391056.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号