在这里使用Angular 1.5.5:
有没有办法告诉Angular忽略特定请求的响应体(例如$ save)?在我调用$ save之后,它让我发疯,使用服务器返回的对象更新模型,最初应该用于区分请求的不同分辨率。它导致不需要的形式清晰。有趣的是,即使我发送400或500 http状态代码,这种行为仍然存在。
如果您需要更多信息,相关代码如下。
控制器:
'use strict';
angular
.module('app.operators')
.controller('OperatorNewController', OperatorNewController);
OperatorNewController.$inject = ['operatorsService', 'notify'];
function OperatorNewController(operatorsService, notify) {
var vm = this;
vm.done = done;
activate();
function activate() {
vm.operator = new operatorsService();
}
function done(form) {
if (form.$invalid) {
// do stuff
return false;
}
vm.operator.$save(function(response) {
if (response.success && response._id) {
$state.go('app.operators.details', {id: response._id}, { reload: true });
} else if (response.inactive) {
// do stuff
} else {
// do other stuff
}
}, function (error) {
// do other stuff
});
}
}
服务:
'use strict';
angular
.module('app.operators')
.service('operatorsService', operatorsService);
operatorsService.$inject = ['$resource'];
function operatorsService($resource) {
return $resource('/operators/:id/', {id: '@_id'}, {
'update': { method: 'PUT' }
});
}
服务器请求处理程序也很简单:
.post('/', function (req, res) {
if (!req.operator.active) {
return res.status(500).json({ inactive: true, success: false });
}
// do stuff
return res.json({ success: true });
});
无论哪种方式,我都不喜欢必须从服务器发送整个对象的想法(特别是当请求失败时),即使我必须这样做,我仍然需要一种方法来发送一些额外的数据将被Angular忽略。
非常感谢您的帮助!
答案 0 :(得分:1)
资源对象的$save
方法清空并用XHR POST结果替换该对象。为避免这种情况,请使用.save
:
operatorsService
方法
//vm.operator.$save(function(response) {
vm.newOperator = operatorsService.save(vm.operator, function(response),
if (response.success && response._id) {
$state.go('app.operators.details', {id: response._id}, { reload: true });
} else if (response.inactive) {
// do stuff
} else {
// do other stuff
}
}, function (error) {
// do other stuff
});
导致不需要的形式清晰。有趣的是,即使我发送了400或500个http状态代码,这种行为仍然存在。
此行为未经验证。
我创建了一个PLNKR来尝试验证此行为,并发现如果服务器返回状态400或500,则$save
方法不会替换资源对象。但是如果XHR状态代码为200(OK),则清空并替换资源对象。
在我调用
$save
之后,角度使用服务器返回的对象更新模型,这让我很生气
有助于理解浏览器如何处理表单中的传统提交。
提交按钮的默认操作使用method=get
。浏览器将表单输入作为查询参数附加到URL,并使用该URL执行HTTP GET操作。然后浏览器清除窗口或框架并从服务器加载结果。
method=post
的默认操作是序列化输入并将它们放在HTTP POST的正文中。然后浏览器清除窗口或框架并从服务器加载结果。
在AngularJS中,form
指令取消浏览器默认操作,并执行由ng-submit
或ng-click
指令设置的角度表达式。包括$resource
和$get
在内的所有$save
实例方法都为空,并且如果XHR成功,则将服务器上的XHR结果替换为资源对象。这与浏览器传统上处理表单的方式一致。
在RESTful API中,HTTP GET操作返回服务器资源的状态而不更改它。 HTTP POST操作向服务器添加新的资源状态。 API通常返回新的资源状态,以及ID,位置,时间戳等附加信息。某些RESTful API返回重定向(状态302或303),在这种情况下,浏览器使用新位置透明地执行HTTP GET。 (这有助于Solve the Double Submission Problem。)
在设计RESTful API时,了解传统浏览器的行为方式以及AngfulJS ngResource等RESTful客户端的期望非常重要。