在Ember.js中查询参数的URL编码

时间:2014-07-09 11:52:39

标签: javascript ember.js url-encoding

我在我的最新项目中使用Ember.js,版本1.7.0-beta.1。我使用query params功能使列表在硬刷新后仍然存在(例如,在重新加载后,列表中的所选项目仍然被选中)。

我有一个管理员的管理员:

export default Ember.ObjectController.extend({
    queryParams: [{selectedFiles: 'files'}],
    selectedFiles: Ember.A([]), //list of file ids

    ... //other props

    actions: {
    selectFile: function(file) {
        //set or remove the file id to the selectedFiles property
    }
});

它很棒,但有一个条件:url是url编码的:

Chrome& IE:

  

路径/ 354文件=%5B" 6513"%2C" 6455"%2C" 6509"%2C" 6507"%2C" 6505"%2C" 6504"%2C" 6511"%5D

FF(自动设置括号):

  

路径/ 354文件=" 6513"%2C" 6455"%2C" 6509"%2C" 6507"%2C" 6505& #34;%2C" 6504"%2C" 6511"]

Ember中有没有办法将query-param-string解码为更易读的格式?也许我可以在某处使用decodeURIComponent()函数?

所需的输出:

  ?

路径/ 354文件= [" 6513"" 6455"" 6509"" 6507"" 6505"" 6504"" 6511"]

1 个答案:

答案 0 :(得分:10)

我遇到了一个非常类似的问题,并通过覆盖路线中的serializeQueryParamdeserializeQueryParam来使其发挥作用。

在控制器中,您将拥有:

queryParams: ['files'],
files: []

在路线中:

  serializeQueryParam: function(value, urlKey, defaultValueType) {
    if (defaultValueType === 'array') {
      return value;

      // Original: return JSON.stringify(value);
    }
    return '' + value;
  }, 

  deserializeQueryParam: function(value, urlKey, defaultValueType) {

    if (defaultValueType === 'array') {

      var arr = [];
      for (var i = 0; i < value.length; i++) {
        arr.push(parseInt(value[i], 10));
      }      

      return arr;

      // Original: return Ember.A(JSON.parse(value));
    }

    if (defaultValueType === 'boolean') {
      return (value === 'true') ? true : false;
    } else if (defaultValueType === 'number') {
      return (Number(value)).valueOf();
    }
    return value;
  }, 

该网址将变为:

?files[]=1&files[]=2&files[]=3

这将是服务器端的真实阵列。

Take a look at this working example on jsbin.com