AngularJS:创build映射到REST资源的对象(ORM样式)
我对AngularJS很新,但是我很不清楚如何将其绑定到我的服务器的REST Api后端。
例如,假设我有一个通过GET-ing获取的“image”资源:myApi / image / 1 /。 这返回一个json对象与各个领域。 我们来说一下:
{url: "some/url", date_created: 1235845}
现在,我想在这个“Image”对象的AngularJS应用程序中进行某种表示。 这种表示不仅仅是字段的映射 – 我想添加“帮助器”函数,例如将date_create
字段转换为人类可读的函数。
我知道$资源服务,但我不清楚我需要做什么来创build一个基本的“类”Angular,使用资源获取JSON对象,但通过添加各种帮助器function,然后增强它。
奖励积分:
我也不清楚如何添加模型之间的“关系”。 例如,我可能有一个“用户”资源,它里面embedded了一个“图像”资源,我想要抓住用户资源,但能够调用“图像”帮助function的“图像”部分该模型。
JSData
一个以angular度数据开始的项目现在是“一个框架无关的数据存储,为了易用性和安心而build立”。 它具有优秀的文档,并支持关系,多个后端(http,localStorage,firebase),validation和angular度整合。
http://www.js-data.io/
BreezeJS
AngularJS YouTube频道以BreezeJS为特色
这是一个先进的ORM,甚至支持客户端过滤和其他很酷的东西。 它最适合支持OData的后端,但可以在其他types的后端上工作。
ngResource
另一个select是使用ngResource ,下面是如何用自己的函数扩展它的例子:
module.factory('Task', function ($resource) { var Task = $resource(WEBROOT + 'api/tasks/:id', {id: '@id'}, {update: { method: 'PUT'}}); angular.extend(Task.prototype, { anExampleMethod: function () { return 4; }, /** * Backbone-style save() that inserts or updated the record based on the presence of an id. */ save: function (values) { if (values) { angular.extend(this, values); } if (this.id) { return this.$update(); } return this.$save(); } }); return Task; });
我发现ngResource是非常有限的,即使与Backbone.Model相比,它有:
- 通过Model.parse自定义JSONparsing
- 可能扩展一个BaseModel(在ngResource中没有baseUrl)
- 其他钩子,如Backbone.sync,启用LocalStorage等
Restangular
“AngularJS服务能够正确,轻松地处理Rest API Restful资源”
http://ngmodules.org/modules/restangular
或者尝试其他一些ORM的
客户端JavaScript ORM有哪些选项可用?
我是Restangular的创造者,所以我的意见可能有偏见。
但正如鲍勃所说,你可以使用Restangular。
Restangular使用您的Restful API资源来遍历树。 你也可以添加新的方法。
这是编码示例: https : //github.com/mgonto/restangular#lets-code
这样,你可以添加新的方法到你的对象(奖金分:)) https://github.com/mgonto/restangular#creating-new-restangular-methods
希望这个为你工作:)。
否则,你也可以使用ngResource($ resource),但是在我看来,它需要一些“爱”和“糖”。
贝斯茨
对于简单的交互,你可以使用Angular-Resource( http://docs.angularjs.org/api/ngResource.$资源),这对于简单的REST交互非常方便(下载到http:://code.angularjs。; org / 1.0.6 / )
可悲的是,只有在使用angular度资源时才能获得有限的控制权,而对于任何更高级的操作,您将需要基于Angularjs $ http服务 – http://docs.angularjs.org/api/ng。$ http来创build自己的服务。
希望有所帮助。
经过大量研究,以下是所有可用解决scheme的综合列表:
-
Restmod
-
Modelizer
-
ModelCore
-
angular手表资源
-
angular宁静
-
ngResource
-
angularjs护栏资源
-
angular嵌套资源
-
Aar.js
-
有效的Activerecord
-
angular数据
-
ngActiveResource
-
restangular
-
BreezeJS
-
NG-骨干
但老实说,我不是很高兴,所以我决定添加到我自己的解决scheme哈哈。 看看这里: $ modelFactory 。
您的最终结果代码看起来像这样:
var module = angular.module('services.zoo', ['modelFactory']); module.factory('AnimalModel', function($modelFactory){ return $modelFactory('api/zoo'); }); return module;
我相信这是一个更好的解决scheme,因为主要模型定义非常类似于Angular的ngResource
,只是增加了一些缺乏的低级function。 它的超级轻量级(1.45k gzip / min),只有一些小的依赖关系(没有lodash,jquery等)。
ModelCore( https://github.com/klederson/ModelCore )的工作方式非常像这样,而且非常容易实现:
var ExampleApp = angular.module('ExampleApp', ['ModelCore']); //injecting ModelCore ExampleApp.factory("Users",function(ModelCore) { return ModelCore.instance({ $type : "Users", //Define the Object type $pkField : "idUser", //Define the Object primary key $settings : { urls : { base : "http://myapi.com/users/:idUser", } }, $myCustomMethod : function(info) { //yes you can create and apply your own custom methods console.log(info); } }); }); //Controller function MainCrtl($scope, Users) { //Setup a model to example a $find() call $scope.AllUsers = new Users(); //Get All Users from the API $scope.AllUsers.$find(); //Setup a model to example a $get(id) call $scope.OneUser = new Users(); //Hey look there are promisses =) //Get the user with idUser 1 - look at $pkField $scope.OneUser.$get(1).success(function() { console.log("Done!",$scope.OneUser.$fetch()); });
Angular Rest-Mod是Angular-based Models / ORM的另一个好select。
Restmod创build可以在Angular中使用的对象来与您的RESTful API进行交互。 它还支持集合,关系,生命周期钩子,属性重命名等等。
另一个ngResource帮助的例子。 这依赖于绝大多数服务是这样的事实:
http://host/api/posts http://host/api/posts/123 http://host/api/posts/123/comments http://host/api/posts/123/comments/456
所以,任务是创build一个帮助者,创build映射到这些服务的AngularJS资源对象。 这里是:
'use strict'; var api = angular.module('api', ['ngResource']); // RESTful API helper api.addService = function (serviceNameComponents) { var serviceName = ""; var resource = "/api"; // Root for REST services var params = {}; serviceNameComponents.forEach(function (serviceNameComponent) { serviceName += serviceNameComponent; var lowerCaseServiceNameComponent = serviceNameComponent.toLowerCase(); var collection = lowerCaseServiceNameComponent + 's'; var id = lowerCaseServiceNameComponent + 'Id'; resource += "/" + collection + "/:" + id; params[id] = '@' + id; }); this.factory(serviceName, ['$resource', function ($resource) { return $resource(resource, {}, { query: { method: 'GET', params: params, isArray: true }, save: { method: 'POST', }, update: { method: 'PUT', params: params, }, remove: { method: 'DELETE', params: params, } } ); } ]); }
所以,使用它只需调用这个帮手
api.addService(["Post"]); api.addService(["Post", "Comment"]);
然后你可以使用Post和PostComment来代码所需的参数:post_id