從遠端API獲取到的回應內容,通常是json格式的,有時候需要對獲取到的內容進行轉換,例如去除某些不需要的字段,給字段取別名,等等。
本篇就來體驗在AngualrJS中如何實現。
在主頁面,還是從controller拿資料。
<body ng-app="publicapi"> <ul ng-controller="controllers.View"> <li ng-repeat="repo in repos"> <b ng-bind="repo.userName"></b> <span ng-bind="repo.url"></span> </li> </ul> </body>
以上,userName, url欄位是從來源資料轉換而來的,可能userName對應來源資料中的fullName,可能來源資料中有更多的欄位。
在AngularJS中,把module之間的關係梳理清楚是一種很好的習慣,例如按如下方式梳理:
angular.module('publicapi.controllers',[]); angular.module('publicapi.services',[]); angular.module('publicapi.transformers',[]); angular.module('publicapi',[ 'publicapi.controllers', 'publicapi.services', 'publicapi.transformers' ])
數據還是從controller來:
angular.module('publicapi.controllers') .controller('controllers.View',['$scope', 'service.Api', function($scope, api){ $scope.repos = api.getUserRepos(""); }]);
controller依賴於service.Api這個服務。
angular.module('publicapi.services').factory('services.Api',['$q', '$http', 'services.transformer.ApiResponse', function($q, $http, apiResponseTransformer){ return { getUserRepos: function(login){ var deferred = $q.defer(); $http({ method: "GET", url: "" + login + "/repos", transformResponse: apiResponseTransformer }) .success(function(data){ deferred.resolve(data); }) return deferred.promise; } }; }])
而$http服務中的transformResponse欄位就是用來轉換資料來源的。 services.Api依賴services.transformer.ApiResponse這個服務,在這個服務力完成資料來源的轉換。
angular.module('publicapi.transformers').factory('services.transformer.ApiResponse', function(){ return function(data){ data = JSON.parse(data); if(data.length){ data = _.map(data, function(repo){ return {userName: reop.full_name, url: git_url}; }) } return data; }; });
以上,使用了underscore對資料來源進行map轉換。