Ember.js: 查询值为null或undefined的参数将序列化为字符串

创建于 2014-03-20  ·  21评论  ·  资料来源: emberjs/ember.js

最有用的评论

_以防有人通过Google找到此内容。_

该问题已基本解决,但仍然存在一个极端情况:如果未在控制器上设置查询参数,它将把null序列化为'null'

var AnimalsController = Ember.Controller.extend({

  queryParams: ['myCat']
  // myCat: null // deliberately not set, to illustrate the issue

});

export default AnimalsController;

所有21条评论

感谢@denisnazarov追踪了这一事件。

pingseñor @machty

@machty我们可以在此方面使用您的帮助

因此,在昨晚苦苦挣扎之后,我不确定这是否完全不受欢迎。 假设您有以下控制器。

App.MyController = Ember.Controller.extend({
  queryParams: ['filters'],
  filters: ['starred']
});

如果将filtersnull并刷新页面,则预期的行为是什么? 如果您不将null序列化为url,则controller属性将设置为其默认值。

这类似于先前实现中的问题,即在虚假值和实际值false之间存在歧义。 现在似乎在defaultValuenullundefined之间是模棱两可的。

这是另一个使用布尔查询参数的示例: http :

如果默认值设置为null ,则将其设置为truefalse实际上会将其设置为字符串版本'true''false'

@HeroicEric那么将其设置为null的引人注目的原因是,如果在生命周期中它将是布尔值true / false呢?

那可能是错的。 我很好奇所有这些序列化案例的用例是什么。

@machty我试图在

例如,我正在显示用户列表,并且希望能够对其进行过滤,以便该列表包含“所有用户”,“管理员用户”或“非管理员用户”。 当我想查看所有用户时,我基本上只是删除过滤器。

这样的情况不是查询参数的意思吗?

理想情况下,URL应该是这样的:

/ users显示所有用户
/ users?admin = true显示所有管理员
/ users?admin = false显示所有不是管理员的用户

@HeroicEric @machty我认为这个想法是,如果未定义控制器上的defaultValue( nullundefined ),它将默认使用字符串。 这可以解释为什么truefalse最终以其字符串版本结尾,因为序列化默认为字符串。

我认为,如果您希望将某个属性设置为null那么我们需要从其他地方获取该类型。 @machty这是将类型添加到路由中的queryParams配置中的一个好理由吗?

如果我们有此选项,则可以将类型设置为'boolean ,并将默认值设置为null

我有这个JSBin示例,不知道我看到的内容是否与此问题有关:

http://jsbin.com/dipajezi/1/edit

基本上,我有一个带有默认值null foo查询参数,并且在应用程序启动时第一次调用我的模型挂钩时,该参数的值为null 。 当参数值为null ,我不想使用此参数来查询服务器,因为它表示“无值”。

查询: ?page=1

当我单击NextPage按钮时,我再次转换,但是这次我更改了page查询参数。 这次foo查询参数的字符串值为"null" ,这有点奇怪。 在这种情况下,我仍然希望具有null ,以便可以轻松地验证该参数没有值。

查询: ?page=1而不是?page=1&foo=null

最后,当我单击ChangeFoo按钮时,我再次转换,这一次将foo查询参数的值设置为任何值。 现在该值不为空,我可以使用该值来构造我的查询字符串。

查询?page=1&foo=3

@raytiley刚刚在https://github.com/raytiley/ember.js/commit/26a3f8569edb58f8644ce4f9cec7000276c327a6#diff -0631ecfe6138cf2c2eb2d94369c3e846R1640上写了一条便条。

如果我将qp显式设置为null ,那么它将被转换为模型挂钩中的字符串。 这似乎不太正确,因为null应该表示“无值”,如果一个人确实想要空字符串,那么他们可以根据值null创建它。

否则,如果要传递仅包含值的QP,则必须执行params.myQP && params.myQp !== "null" ..

我认为这已经过时了,但是如果有人可以在使用以下ember.js的JSBin中演示该问题,它将重新打开: http ://s3.amazonaws.com/machty/to_s3_uploads/ember-9fbe6c2a-c124-5c2e-0414

_以防有人通过Google找到此内容。_

该问题已基本解决,但仍然存在一个极端情况:如果未在控制器上设置查询参数,它将把null序列化为'null'

var AnimalsController = Ember.Controller.extend({

  queryParams: ['myCat']
  // myCat: null // deliberately not set, to illustrate the issue

});

export default AnimalsController;

对于@HeroicEric的用例,控制器将不知道如何根据其生命周期中的值智能地进行序列化。 这似乎在最新版本(2.6)中起作用:

export default Ember.Controller.extend({
  queryParams: [{ 
     redevelopment: { 
         type: 'boolean' 
     } 
  }],
  redevelopment: null
});

工作余烬捻转: https ://ember-twiddle.com/3afa1091106a91ce2c1734ae2998bc3f?openFiles & route

由于QP何时允许设置类型? 还是只是提议一个新的API?

它似乎没有记录。 放眼这里,似乎可以被覆盖。

哦,那很好!

谢谢@allthesignals ,它对您的解决方案很有帮助。

这个解决方案怎么样?

{ key: undefined }? _(不包括)_
{ key: null }?key
{ key: '' }?key=
{ key: 'null' }?key=null

好名单!

我为此投票:
{ key: undefined }[nothing] _(不包括)_
{ key: null }[nothing] _(不包括)_
{ key: '' }?key
{ key: 'null' }?key=null

可能还有:

{ key: false }[nothing] _(不包括)_
{ key: true }?key

此页面是否有帮助?
0 / 5 - 0 等级