問題

私は最新のプロジェクトで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
    }
});
 

それは素晴らしいですが、1つの条件で動作します:URLはurl-encodedです:

Chrome&IE:

パス/ 354?ファイル=%5B "6513"%2C "6455"%2C "6509"%2C "%2507"%2C "6505"%2C "6505"%2C "6504"%2C "6504"%2C "65011"%5D

FF(括弧を自動的に設定します):

パス/ 354?ファイル= "6513"%2C "6455"%2C "6509"%2C "6507"%2C "6505"%2C "%6504"%6504 "%2C"%2C "%2C" 65011"]

Emberにquery-param-stringをより再利用可能な形式にデコードする方法はありますか?たぶん私はどこかでdecodeURIComponent()関数を使うことができますか?

望ましい出力:

パス/ 354?ファイル= ["6513"、 "6455"、 "6509"、 "650507"、 "6505"、 "6504"、 "65011"]

  ベストアンサー

私は非常に似た問題を抱えており、ルート内の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;
  }, 
 

URLは次のようになります:

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

これはサーバー側の実際の配列になります。

jsbin.com のこの実例を見てください

  同じタグがついた質問を見る

javascriptember.jsurl-encoding