如何强制 Restangular 的 getList 使用 Laravel 5 的分页对象?
How to force Restangular's getList to work with Laravel 5's pagination object?
我有一个页面,我想在其中显示分页的用户帖子。对于后端,我使用 Laravel 的资源控制器,在前端使用 Restangular 服务。
所以后端实现是这样的:
// url is /users/0/posts
public function index(Post $post)
{
return $post->whereUserId(\Auth::id())->paginate(20);
}
前端看起来像这样:
/*
* posts.service.js
*/
angular.module('app.services')
.service('posts', Posts);
Posts.$inject = ['Restangular'];
function Posts(Restangular) {
return Restangular.service('posts', Restangular.one('users', 0));
}
/*
* posts.controller.js
*/
angular.module('koodzo.controllers')
.controller('PostsController', PostsController);
ContentController.$inject = ['posts'];
function PostController(posts) {
var vm = this;
vm.posts = posts.getList()
.then(function(response) {
vm.pagination = response;
vm.posts = response.data;
});
}
所以,很明显,这是行不通的,因为 Restangular 的 getList 期望从服务器接收一个数组以对其进行 restangularize,但是 Laravel 的分页器 returns 一个对象和数组是在对象的 data
字段中。
问题是如何让 Restangular 看到 response.data
是它需要的数组?
为了使 Laravel 的分页响应与 Restangular 的 getList() 一起工作,您需要注册一个 响应拦截器 它将 return 无论你得到 response.data 作为回应。
以下代码可以解决问题:
app.module('yourModule').config(function(RestangularProvider) {
RestangularProvider.addResponseInterceptor(parseApiResponse);
function parseApiResponse(data, operation) {
var response = data;
if (operation === 'getList' && data.data) {
response = data.data;
response.metadata = _.omit(data, 'data');
}
return response;
}
});
您对 getList() 的调用将直接为您提供 data 对象。此外,您将能够访问 Laravel return 的分页元数据 - 它将存储在您的响应的 元数据 属性 中。
我有一个页面,我想在其中显示分页的用户帖子。对于后端,我使用 Laravel 的资源控制器,在前端使用 Restangular 服务。
所以后端实现是这样的:
// url is /users/0/posts
public function index(Post $post)
{
return $post->whereUserId(\Auth::id())->paginate(20);
}
前端看起来像这样:
/*
* posts.service.js
*/
angular.module('app.services')
.service('posts', Posts);
Posts.$inject = ['Restangular'];
function Posts(Restangular) {
return Restangular.service('posts', Restangular.one('users', 0));
}
/*
* posts.controller.js
*/
angular.module('koodzo.controllers')
.controller('PostsController', PostsController);
ContentController.$inject = ['posts'];
function PostController(posts) {
var vm = this;
vm.posts = posts.getList()
.then(function(response) {
vm.pagination = response;
vm.posts = response.data;
});
}
所以,很明显,这是行不通的,因为 Restangular 的 getList 期望从服务器接收一个数组以对其进行 restangularize,但是 Laravel 的分页器 returns 一个对象和数组是在对象的 data
字段中。
问题是如何让 Restangular 看到 response.data
是它需要的数组?
为了使 Laravel 的分页响应与 Restangular 的 getList() 一起工作,您需要注册一个 响应拦截器 它将 return 无论你得到 response.data 作为回应。
以下代码可以解决问题:
app.module('yourModule').config(function(RestangularProvider) {
RestangularProvider.addResponseInterceptor(parseApiResponse);
function parseApiResponse(data, operation) {
var response = data;
if (operation === 'getList' && data.data) {
response = data.data;
response.metadata = _.omit(data, 'data');
}
return response;
}
});
您对 getList() 的调用将直接为您提供 data 对象。此外,您将能够访问 Laravel return 的分页元数据 - 它将存储在您的响应的 元数据 属性 中。