在ngResource AngularJS中将值作为值发送
我使用的是AngularJS 1.2.1的ngResource,我试图在PUT请求中的参数中发送null
作为参数。 不幸的是,当它被设置时,Angular会忽略它的参数并且不会发送它。
以下是一些示例代码:
var User = $resource('/comments/:id', {id:'@id'}, {
destroy: { method: 'PUT', params: {content: null} }
});
var user = User.destroy({id:123}, function() {});
Angular会改为忽略content
,不发送密钥或null值。
我如何让Angular发送null?
正如莱斯指出的那样,JavaScript类型的null
对于URL参数来说不是有效的值。
javascript null
值与字符串'null'
。 所以如果你想让你的URL看起来像/comments/123?content=null
只需要提供一个字符串'null'
。 URL参数不是JSON,JavaScript中的null
值与content=null
因为在后一种情况下,null会被任何给定的服务器解释为字符串值。
Angular的$ http服务在使用它们构造url之前,在params对象中过滤掉null和undefined值,因为没有标准方式将undefined
的值作为“值”发送到服务器。 这只是没有意义。 但是,如果你想发送一个像'undefined'
或'null'
这样的字符串,那很好,但它需要服务器端的实现来解释它。
如果您正在发出PUT
请求,为什么有些数据在资源中被序列化为JSON,其中一些数据是通过URL参数发送的? 也许这个示例代码只是代表性很差,但在这个例子中,你发送了一个PUT
请求,响应主体是{"id": 123}
和url /comments/123
。 这不是多余的吗? 你为什么不把JSON字符串中的content
属性和数据发送到服务器? 那么它实际上会有你正在寻找的null
值,因为JSON字符串可以表示一个null
类型值。 另外,如果您要删除/销毁记录,为什么不使用DELETE
请求,而是使用PUT请求对销毁方法进行别名处理?
那么为什么不这样呢? 我不确定User
需要怎么处理它...
var Comment = $resource('/comments/:id', {id: @id}, {
destroy: {method: 'PUT'}
});
new Comment({id: 123, content: null}).$destroy();
自从我的问题以来所做的评论意味着不应该发送null
因为它无法正确地封装在HTTP参数中。 但是,它可以封装在JSON中。 为什么会有人想发送一个空值? 因为将null发送给upsert
[1]端点意味着销毁。 不幸的是,在.destroy()
调用中没有办法将content
的缺省值定义为null。
我解决的答案是:
var Comment = $resource('/comments/:id', {id:'@id'}, {
destroy: { method: 'PUT' }
});
var comment = Comment.destroy({id:123, content: null});
这与@ jbielick的答案完全一样,他做了一个很好的工作,解释了为什么它不作为默认参数工作的原因,但是如果它作为JSONify的输入对象的一部分提供的话,它会工作。
上一篇: Send null as a value in ngResource AngularJS
下一篇: Why use element[0] instead of element when creating AngularJS directive with d3?