AngularJS ngResource 删除事件不调用回调
Posted
技术标签:
【中文标题】AngularJS ngResource 删除事件不调用回调【英文标题】:AngularJS ngResource delete event not calling callback 【发布时间】:2016-04-04 13:13:39 【问题描述】:我有这个代码:
dogsResource.delete(id: $stateParams.dogId, angular.noop,
function(value, responseHeaders)
//Success
console.log(value);
console.log(responseHeaders);
,
function(httpResponse)
//Error
console.log(httpResponse);
);
删除完成,问题是既没有调用成功也没有调用错误。我也尝试过使用实例(也就是说,使用 $delete),但它也没有工作。
我尝试使用其他方法测试回调,例如 get
$scope.dog = dogsResource.get(id: $stateParams.dogId, function(value, res)
console.log(value);
);
而且它有效。我不知道为什么会这样,因为这只狗正在从数据库中删除。
谢谢
更新
dog资源代码
// Return the dogs resource
.factory('dogsResource', ['$resource', function($resource)
return $resource("http://localhost:5000/dogs/:id",id: "@id",update: method: "PUT");
])
更新 2
我发现了错误。它在 RESTful API(Node js)中。该方法没有向 Angular 发送任何内容,因此没有触发回调:
//DELETE - Delete a dog with specified ID
exports.deleteDog = function(req, res)
console.log('DELETE' + req.params.id);
Dog.findById(req.params.id, function(err, dog)
dog.remove(function(err)
if(err) return res.status(500).send(err.message);
console.log('Succesfully deleted.');
res.status(200);
)
);
;
将res.status(200)
替换为res.status(200).end()
触发了回调。
感谢大家的宝贵时间。
【问题讨论】:
我知道这听起来很明显,但 angular.noop 应该存在吗? @camden_kid 文档说非 http get 操作应该有一个 postData,我不需要那个。顺便说一句,我也尝试过使用 null、 甚至忽略它。 是的,根据***.com/questions/16579201/…,你是对的。控制台有错误吗? 无,如我所说,删除完成,但不打印日志。 你试过使用 promise 属性吗?像这样dogsResource.delete(id: $stateParams.dogId).$promise.then(function(value) console.log('value', value));
【参考方案1】:
我建议你不要使用
res.status(200).end()
实际上,通常当您在 expressJS 中使用 REST 服务删除对象时,常见的情况是发送已删除的对象作为响应,因为前端获取该对象可能很有用(并确保它是好对象)。
所以不要使用
res.status(200).end()
使用
res.send(狗)
或者如果你想发送一个空响应,删除操作的状态码应该是:
res.status(204).end()
204 无内容
注意,不需要设置状态码,默认为200,所以设置状态码为200是没有用的。
完成一个http响应需要发送关闭请求。 end 方法或 send 方法可以做到这一点。将状态代码设置为响应 http 永远不会向前端发送任何内容。这就是为什么您的角度回调从未被触发的原因。
所以我建议你将标签 expressjs 添加到你的问题中,因为这不是 AngularJS 的问题,而是一个真正的 expressJS 错误。
【讨论】:
你是对的。自从删除完成后,我认为它是有角度的,但后来我发现它实际上是 de Api。我会检查你所说的,所有其他方法(获取、保存等)发送res.send(dog)
,但删除是我在操作中发布的。我会添加标签。【参考方案2】:
我最近正在使用 ngResource。就我而言,我在该 api 调用中使用了三个参数。因此,您可以使用
dogsResource.delete(id: $stateParams.dogId, function(value, responseHeaders)
//Success
console.log(value);
console.log(responseHeaders);
,
function(httpResponse)
//Error
console.log(httpResponse);
);
希望对你有帮助。
【讨论】:
【参考方案3】:使用$resource
对象的承诺返回。作为 $resource 对象默认返回一个 promise 对象,并且该 promise 对象在 .$promise
变量上可用 $resource
API 方法。
代码
dogsResource.delete(id: $stateParams.dogId).$promise.then(function(data)//Success
console.log(value);
,
function(httpResponse) //Error
console.log(httpResponse);
);
【讨论】:
@CamiloR 你能在你的问题中添加你的dogsResource
代码吗?
这里是资源的代码,希望对您有所帮助。
@CamiloR 尝试将您的 $resource
对象更改为 $resource("http://localhost:5000/dogs/:id", ,update: method: "PUT")
,因为您在传递其值时使用了相同的属性名称 id
。【参考方案4】:
在您的代码中,第二个参数是angular.noop
:
dogsResource.delete(id: $stateParams.dogId, angular.noop,
function(value, responseHeaders)
//Success
console.log(value);
console.log(responseHeaders);
,
function(httpResponse)
//Error
console.log(httpResponse);
);
根据ngResource Source Code,如果您将第二个参数设置为一个函数(angular.noop
是 一个函数),那么它将使用第二个参数作为成功回调。由于第二个参数是空操作,所以调用它时不会发生任何事情。
尝试将第二个参数设置为function (r) console.log (r)
,看看会得到什么。
【讨论】:
不,不是那样,正如我在操作的评论中所说的那样。即使按照您所说的进行更改,也不会调用回调。以上是关于AngularJS ngResource 删除事件不调用回调的主要内容,如果未能解决你的问题,请参考以下文章
根据所选项目在 ngResource (angularjs) 中查询数据
AngularJS:如何使用 ngResource 处理成功和错误回调?
我如何在 angularjs 中使用 Restful。我使用了 ngResource 但它不起作用。如果我使用 ngResource,js 文件 nt 正在执行