2016-06-22 2 views
1

У меня есть простой завод в 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, созданный с помощью применяемого фильтра. Как я могу это сделать? Я играю с прототипом, но безуспешно.

ответ

1

Вы можете архивировать то, что хотите, определив новый класс и используйте прототип, подобный этому.

В свободном методе не забудьте вернуть сам объект.

function service(){ 
 
     var products = function(url) { 
 
      
 
      // Define a new Product class 
 
      var Products = function() { 
 
       this.url = url; 
 
       this.data = {}; 
 
      }; 
 
      
 
      // Add the function 
 
      Products.prototype.FilterById = function(id) { 
 
       this.data.id = id; 
 
       // To make it fluent, return the object itself 
 
       return this; 
 
      }; 
 
       
 
      Products.prototype.FilterByCategory = function(category) { 
 
       this.data.category = category; 
 
       return this; 
 
      }; 
 
       
 
      Products.prototype.send = function() { 
 
       console.log(this.data); 
 
      }; 
 
       
 
      // Return an instance of the Products class 
 
      return new Products(); 
 
      }; 
 
     
 
     return { 
 
      Products : products 
 
     }; 
 
    }; 
 
    
 
service().Products().FilterById(1).FilterByCategory("Item").send();

Вы можете прочитать об этом здесь: https://www.sitepoint.com/javascript-like-boss-understanding-fluent-apis/

+2

Класс '' продуктов может быть объявлена ​​вне 'метода' продуктов, но все еще внутри сервисной функции, так что не объявляется каждый раз, когда вызывается 'Products()'. – GillesC

Смежные вопросы