angular $resource 收到额外信息
angular $resource receive extra information
我正在使用 ng-resource 来做 ajax 请求。除了数据之外,我还想发送额外的信息。
例如,我的服务器上有一个文章实体
exports.fetchArticle = function(req, res, next) {
var article = req.article
return res.json({data: article, message: 'success fetch article'})
}
我把它包裹起来的原因是,在删除的情况下,发送数据没有意义,我可以return res.json({data: null, message: 'deleted successfully'})
在我的客户端,我有:
$scope.fetchArticle = function() {
Article.get({articleId: $routeParams.articleId}, function(response) {
$scope.article = response.data
$scope.ajaxSuccess = response.message
}, function(err) {
$scope.ajaxError = err.data.message
})
}
$scope.article 不再是 ng-resource 的实例,因此我不能用 $scope.article 做进一步的请求,即这会导致错误,因为 $scope.article是一个普通的 json 对象:
$scope.article.$update(function(response) {...})
如果我只是从服务器return res.json(article)
,它可以工作,但我无法发送消息。
我不从客户端生成消息而是从服务器获取消息的原因是,错误消息来自服务器,我想使成功消息与错误消息保持一致。
有没有其他优雅的方式发送消息?
假设 所有 您的服务器响应都遵循以下格式:
{
data: {/*...*/},
message: 'some message'
}
您可以为此使用 $http
's transformResponse
,这样您就可以得到一个 是 您返回的对象的 ngResource 实例,同时仍在处理您的消息。为此,您需要一个转换函数:
function processMessage(data, message) {
//Do whatever you want with your message here, like displaying it
}
function transform(response) {
processMessage(response.data,response.message);
var data = response.data;
delete response.data;
delete response.message;
for(var attributeName in data) {
response[attributeName] = data[attributeName];
}
return response;
}
然后您可以将此功能添加到您应用程序 config
中 $http
的默认转换:
angular.module("yourApp",[/* ... */])
.config(function($httpProvider){
//....all your other config
$httpProvider.defaults.transformResponse.unshift(transform);
});
现在,来自 $http
的所有回复都通过此函数进行转换,触发 processMessage
并为您留下返回对象的 ngResource 实例。
我正在使用 ng-resource 来做 ajax 请求。除了数据之外,我还想发送额外的信息。
例如,我的服务器上有一个文章实体
exports.fetchArticle = function(req, res, next) {
var article = req.article
return res.json({data: article, message: 'success fetch article'})
}
我把它包裹起来的原因是,在删除的情况下,发送数据没有意义,我可以return res.json({data: null, message: 'deleted successfully'})
在我的客户端,我有:
$scope.fetchArticle = function() {
Article.get({articleId: $routeParams.articleId}, function(response) {
$scope.article = response.data
$scope.ajaxSuccess = response.message
}, function(err) {
$scope.ajaxError = err.data.message
})
}
$scope.article 不再是 ng-resource 的实例,因此我不能用 $scope.article 做进一步的请求,即这会导致错误,因为 $scope.article是一个普通的 json 对象:
$scope.article.$update(function(response) {...})
如果我只是从服务器return res.json(article)
,它可以工作,但我无法发送消息。
我不从客户端生成消息而是从服务器获取消息的原因是,错误消息来自服务器,我想使成功消息与错误消息保持一致。
有没有其他优雅的方式发送消息?
假设 所有 您的服务器响应都遵循以下格式:
{
data: {/*...*/},
message: 'some message'
}
您可以为此使用 $http
's transformResponse
,这样您就可以得到一个 是 您返回的对象的 ngResource 实例,同时仍在处理您的消息。为此,您需要一个转换函数:
function processMessage(data, message) {
//Do whatever you want with your message here, like displaying it
}
function transform(response) {
processMessage(response.data,response.message);
var data = response.data;
delete response.data;
delete response.message;
for(var attributeName in data) {
response[attributeName] = data[attributeName];
}
return response;
}
然后您可以将此功能添加到您应用程序 config
中 $http
的默认转换:
angular.module("yourApp",[/* ... */])
.config(function($httpProvider){
//....all your other config
$httpProvider.defaults.transformResponse.unshift(transform);
});
现在,来自 $http
的所有回复都通过此函数进行转换,触发 processMessage
并为您留下返回对象的 ngResource 实例。