更改服务中的数据

时间:2017-07-31 17:45:14

标签: javascript angularjs angular-components

我有一个从URL抓取JSON的服务,我想改变那些数据,但我似乎无法做到这一点。现在我在控制器中更改了这个但是这个范围似乎很乱,范围没有到达我想要的地方。

//SERVICE
app.service("servers", function ($http, $q)
{
    // Grab json
    var deferred = $q.defer();
    $http.get('http://www.mocky.io/v2/58bea87e260000c318f07bfd').then(function (data)
    {
        deferred.resolve(data);
    });

    this.getItems = function ()
    {
        return deferred.promise;
    }

})


   // CONTROLLER

.controller("AppCtrl", function ($scope, servers, geoIP) {
    var promise = servers.getItems();
    promise.then(function (data)
    {
        $scope.items = data.data.items;
    });

    $scope.getSelectedItem = function() {
        return servers.selectedItem;
    }


    $scope.selectServer = function(item)
    {
        servers.selectedItem = item;

         servers.selectedItem.refactored_match_state = lowerCamelCaseUnderscoreRefactor(servers.selectedItem.session.attributes.match_state);

    }

    //COMPONENT/TEMPLATES
    //dbServerTable
    <tr data-ng-repeat="item in items | filter:search | orderBy:'name'"  data-ng-click="selectServer(item)">
        <td>{{item.display_name}}</td>
    </tr>

    //dbServerInfoSidebar
    <li>{{getSelectedItem().refactored_match_state}}</li>

任何人都可以通过代码向我展示如何更改服务中的数据,任何可以访问该服务的控制器都可以在任何地方使用该数据

4 个答案:

答案 0 :(得分:1)

  1. 您可以使用transformResponse property$http service;
  2. 您可以在解决承诺之前修改数据 deferred.resolve(data);

答案 1 :(得分:1)

您是否正在尝试执行以下操作:

app.service("servers", function ($http, $q)
{
    this.parseData = data => {
        //modify data;
        return data;
    };

    this._request = $http.get('http://www.mocky.io/v2/58bea87e260000c318f07bfd')
      .then(this.parseData);

    this.getItems = () => this._request;
});

你根本不需要使用延迟。这是不必要的。 $ http为您返回一个承诺。如果要更改任何数据,只需在请求后链接并在链接方法中返回修改后的数据。

答案 2 :(得分:1)

服务编码的方式是反模式,应该避免。请参阅此link

更改您的服务,如下所示,并在data函数中返回.then之前对数据进行修改。

app.service("servers", function ($http)
{
    this.getItems = function ()
    {
        return $http.get('http://www.mocky.io/v2/58bea87e260000c318f07bfd')
              .then(function (data)
                  {
                    // **** Modify data here ****
                    return data;
                  });
    }

})

答案 3 :(得分:1)

app.service('services',['$q','$http','$rootScope',function($q,$http,$rootScope){
    var obj ={};
        obj.getData =function(x){
        var defer = $q.defer();
        $http.get('http://www.mocky.io/v2/58bea87e260000c318f07bfd')
        .then(function(response){
            defer.resolve(response);
        },function(error){
            defer.reject(error);
        });
        return defer.promise;
      }
    return obj;
    }])

app.controller('ctrl',function($scope,services){
   $scope.getItems = function(){
     services.getData()
    .then(function(response){
      $scope.Items=response.data;
    },function(error){
      console.log(error);
    });
  }
})