如何有效地将记录存储为Ember查询参数

时间:2016-03-09 18:33:49

标签: ember.js query-parameters ember-query-params

背景:用户可以根据标签过滤列表,每个标签都是Ember数据模型。选定的过滤标签应通过查询参数存储在URL中。我还想在界面中显示所选标签。

最好的方法是什么?

我非常确定我只想存储ID,但如果我这样做,我必须维护一个单独的变量/计算属性,其中我存储来自查询参数的ID的实际记录。这种重复似乎对我不利。

除了这个问题,我不知道我是应该使用数组查询参数还是构建逗号分隔的ID字符串。如果我做前者,我最终会得到像?tags=%5B"3"%5D这样丑陋的网址。但是做后者意味着要做更多的工作。

那么你解决这类问题的方法是什么?我希望我错过了一些没有明显缺点的东西:)

1 个答案:

答案 0 :(得分:1)

容易!

  1. 找出哪些非字母数字字符未在URL中编码。使用this tool,我找到了这些字符:~!*()_-.
  2. 选择一个未在标记名称中使用的字符。我们说它是*。将它用作分隔符。
  3. 使用标记ID的标记名称。或者至少强制使用唯一的标签名称。
  4. 然后你有一个很好的可读查询:

    ?tags=foo*bar*baz&search=quux
    

    要实现自定义查询参数序列化/反序列化,请执行以下操作:

    Ember.Route.reopen({
      serializeQueryParam: function(value, urlKey, defaultValueType) {
        if (defaultValueType === 'array') {
          return `${value.join('*')}`;
        }
        return this._super(...arguments);
      },
    
      deserializeQueryParam: function(value, urlKey, defaultValueType) {
        if (defaultValueType === 'array') {
          return value.split('*');
        }
        return this._super(...arguments);
      }
    });
    

    演示:appcode

    如果您必须在查询参数中使用数字标记ID(例如,您的标记名称不唯一),那么您需要进行更多自定义:app,{{3} }。