從遠(yuǎn)程API獲取到的響應(yīng)內(nèi)容,通常是json格式的,有時(shí)候需要對(duì)獲取到的內(nèi)容進(jìn)行轉(zhuǎn)換,比如去除某些不需要的字段,給字段取別名,等等。
本篇就來(lái)體驗(yàn)在AngualrJS中如何實(shí)現(xiàn)。
在主頁(yè)面,還是從controller中拿數(shù)據(jù)。
<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字段是從源數(shù)據(jù)中轉(zhuǎn)換而來(lái)的,可能userName對(duì)應(yīng)源數(shù)據(jù)中的fullName,可能源數(shù)據(jù)中有更多的字段。
在AngularJS中,把module之間的關(guān)系梳理清楚是一種很好的習(xí)慣,比如按如下方式梳理:
angular.module('publicapi.controllers',[]);angular.module('publicapi.services',[]);angular.module('publicapi.transformers',[]);angular.module('publicapi',['publicapi.controllers','publicapi.services','publicapi.transformers'])
數(shù)據(jù)還是從controller中來(lái):
angular.module('publicapi.controllers').controller('controllers.View',['$scope', 'service.Api', function($scope, api){$scope.repos = api.getUserRepos("");}]);
controller依賴于service.Api這個(gè)服務(wù)。
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服務(wù)中的transformResponse字段就是用來(lái)轉(zhuǎn)換數(shù)據(jù)源的。services.Api依賴于services.transformer.ApiResponse這個(gè)服務(wù),在這個(gè)服務(wù)力完成對(duì)數(shù)據(jù)源的轉(zhuǎn)換。
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對(duì)數(shù)據(jù)源進(jìn)行map轉(zhuǎn)換。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注