У меня есть простой завод в AngularJS:Сложение свободно обслуживание в AngularJS
(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
) используются для фильтрации конечного результата. Это работает как шарм! Но с небольшим недостатком: есть много принятых аргументов для Products
, и действительно трудно понять, отправляю ли я правильные параметры, и это звучит немного склонно к ошибкам. Что бы это свободно API для обслуживания, которые делают все более читаемым человеком, это было бы здорово:
myInjectedService
.Products()
.FilterById(p1)
.WhereCategoryIs(p2)
...
.WhereSomethingElseIs(pn)
.Send()
.then(successCallbackFn)
.catch(failureCallbackFn);
Ранее задача HTTP вызов был обработан Products
вызова. Прямо сейчас Products()
, сделайте пустой запрос (т. Е. {}
). Каждый последующий FilterByX
обогатит запрос (т. Е. {'productId': 'xxx-yyy-1111'}
). Вызов Send()
сделает настоящий HTTP POST-вызов. Этот вызов будет использовать data
, созданный с помощью применяемого фильтра. Как я могу это сделать? Я играю с прототипом, но безуспешно.
Класс '' продуктов может быть объявлена вне 'метода' продуктов, но все еще внутри сервисной функции, так что не объявляется каждый раз, когда вызывается 'Products()'. – GillesC