在AngularJS中构建流畅的服务
我在AngularJS有一个简单的工厂:在AngularJS中构建流畅的服务,angularjs,fluent,Angularjs,Fluent,我在AngularJS有一个简单的工厂: (function(){ 'use strict'; angular .module('myModule', []) .factory('myService', service); function service(){ var products= function(p1, p2, p3, ..., pn) { var url = "http://somethin
(function(){
'use strict';
angular
.module('myModule', [])
.factory('myService', service);
function service(){
var products= function(p1, p2, p3, ..., pn) {
var url = "http://something.url/api/action";
var data = {
'p1': p1,
'p2': p2,
...
'pn': pn,
}
// return data
return $http
.post(url, data)
.then(function (response) {
return response.data;
});
}
return {
Products : products
};
}
})();
我在控制器中使用此服务,如下所示:
myInjectedService
.Products(vm.p1, vm.p1, ... , vm.pn)
.then(successCallbackFn)
.catch(failureCallbackFn);
每个参数(p1
,…,pn
)用于过滤最终结果。这很有魅力!但是有一个小缺点:产品有很多公认的参数,很难知道我是否发送了正确的参数,这听起来有点容易出错。我想为服务提供一个流畅的API,使所有内容都更具可读性,这将非常好:
myInjectedService
.Products()
.FilterById(p1)
.WhereCategoryIs(p2)
...
.WhereSomethingElseIs(pn)
.Send()
.then(successCallbackFn)
.catch(failureCallbackFn);
以前HTTP调用的任务是由Products
call处理的。现在Products()
,只做一个空查询(即{}
)。每个后续的FilterByX
都将丰富查询内容(即{'productId':'xxx-yyy-1111'}
)。调用Send()
将进行真正的HTTP POST调用。此调用将使用通过应用的各种筛选器生成的数据。我该怎么做?我正在玩prototype,但没有成功。您可以通过定义一个新类并像这样使用prototype来构建您想要的
在fluent方法中,记住返回对象本身
函数服务(){
变量产品=函数(url){
//定义一个新的产品类
var乘积=函数(){
this.url=url;
this.data={};
};
//添加函数
Products.prototype.FilterById=函数(id){
this.data.id=id;
//要使其流畅,请返回对象本身
归还这个;
};
Products.prototype.FilterByCategory=功能(类别){
this.data.category=类别;
归还这个;
};
Products.prototype.send=函数(){
console.log(this.data);
};
//返回Products类的实例
退回新产品();
};
返回{
产品:产品
};
};
服务().Products().FilterById(1.FilterByCategory(“项目”).send()
Products
类可以在Products
方法外部声明,但仍然在服务函数内部,因此不会在每次调用Products()
时声明。