在服务中使用$ http数据

时间:2016-02-02 00:48:38

标签: angularjs ionic-framework

我想创建一个小型移动发票应用程序来查看发票,更新发票和管理客户数据。

因此我想创建一个服务,首先通过API加载所有发票,然后让所有其他服务方法都可以访问它。

例如:myService.getInvoices()应该使用$ http请求加载所有发票并返回它们。 myService.getInvoices(id)应该返回一张发票。如果首先调用getInvoices(id),它应首先加载所有发票($ http),然后返回特定的发票。

现在是棘手的部分。我想编辑应用程序内的发票。保存发票数据时应该只是服务中的更新,然后$ http post请求应该将数据发送到api。这样,发票清单应始终保持更新,而无需从api完全重新加载发票。与插入新发票的方式相同。

总结:应用程序应该能够在加载所有发票一次后脱机工作。只有第一次加载,更新和插入才能执行任何请求。

实现这一目标的最佳方式是什么?

2 个答案:

答案 0 :(得分:0)

看起来您假设除了移动应用以外的任何地方都不会发生变化。一个需要加载数据的应用程序,这可能是不准确的。

但是,要回答您的问题,您始终可以更新服务内部的模型,发送更新请求并返回。所有HTTP请求都是异步的。用户不必等待它们。

如果你想要一些非常先进的东西,有了正确的离线模型缓存,你可以试试像breezeJS(more about offline features)这样的东西可以和AngularJS(more about Angular support)一起使用。

答案 1 :(得分:0)

您可以创建一个工厂/服务,从请求中检索数据,然后在需要的地方重新使用存储的数据:

module.factory('myService', function ($http) {
   var invoiceValues;

   // this will make a http request and store the result
   var requestInvoiceValues = function() {
    $http.get("/api/getInvoices").then(
        function(results){
            invoiceValues = results;
        });
  };

  // call the stored result, returning all invoices(without making a http request)
  var getInvoices = function() {
    return invoiceValues;
  };

  // call stored result, returning filtered values
  var getInvoiceById = function(id) {
    var filteredValues;
    // TODO: filter values logic using 'invoiceValues'
    return filteredValues;
  };

   return{
     requestInvoiceValues : requestInvoiceValues, 
     getInvoices : getInvoices,
     getInvoiceById : getInvoiceById 
   }

});

现在,只要您需要检索这些内容,就可以致电getInvoiceValues。只要您需要从服务器更新发票值,您只需拨打requestInvoiceValues即可。请注意,在致电requestInvoiceValues填充发票之前,您需要在某个阶段致电getInvoiceValues

myApp.controller('MyController', function ($scope, myService) {
  var init = function (){
    myService.requestInvoiceValues(); // this will make the http request to the server       
  };

  var justGetValues = function(){
    $scope.items = myService.getInvoices(); // this will get the result (without making a http request)
  };

});