從遠程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轉換。
新聞熱點
疑難解答