Javascript Ember.js中查询参数的Url编码

Javascript Ember.js中查询参数的Url编码,javascript,ember.js,url-encoding,Javascript,Ember.js,Url Encoding,在我的最新项目中,我正在使用Ember.js版本1.7.0-beta.1。我使用该功能使列表在硬刷新后仍然有效(例如,重新加载后,列表中的选定项仍处于选中状态) 我有一个管理员负责管理: export default Ember.ObjectController.extend({ queryParams: [{selectedFiles: 'files'}], selectedFiles: Ember.A([]), //list of file ids ... //ot

在我的最新项目中,我正在使用Ember.js版本
1.7.0-beta.1
。我使用该功能使列表在硬刷新后仍然有效(例如,重新加载后,列表中的选定项仍处于选中状态)

我有一个管理员负责管理:

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(自动设置括号):

path/354?files=“6513”%2C“6455”%2C“6509”%2C“6507”%2C“6505”%2C“6504”%2C“6511”]

在Ember中是否有方法将查询参数字符串解码为更易于阅读的格式?也许我可以在某处使用
decodeURIComponent()
函数

所需输出:

路径/354?文件=[“6513”、“6455”、“6509”、“6507”、“6505”、“6504”、“6511”]


我遇到了一个非常类似的问题,通过重写路由中的
serializeQueryParam
反序列化QueryParam
使其工作

在控制器中,您将有:

queryParams: ['files'],
files: []
在路线上:

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

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

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


太棒了,这些钩子正是我需要的。谢谢!我尝试了上述方法,但将
反序列化queryparam()
更改为只返回
,而不对其每个值进行
parseInt()
运算。问题是,查询参数和控制器的
文件
属性之间的绑定没有正确更新,似乎Ember无法识别值的更改时间。因此,我必须在
value
内部调用
反序列化queryparam()
上的
.copy()
,以便Ember在值更新时注意到。如果其他人在这个问题上陷入困境,请提醒一下。您需要使用
Ember.$.ajaxSettings.traditional=true,请参阅
  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