更改查询参数未显示在网址

时间:2017-04-08 20:26:27

标签: ember.js ember-query-params

我想单击“导出”按钮并转到“home”路径,并将“export”查询参数设置为true。我不希望这个查询参数刷新我的路线。所以这是我的路线的样子:

export default Route.extend(ApplicationRouteMixin, {
  queryParams: {
    export: {
      refreshModel: false
    }
  }
})

在我的控制器中,我正在尝试观察查询参数并调用一个为我导出的函数,之后我想将查询参数设置为null。这是我的控制器:

import Ember from 'ember'
const {Controller, inject} = Ember

export default Controller.extend({
  // == Dependencies ==========================================================
  session: inject.service(),
  // == Keyword Properties ====================================================
  queryParams: ['export'],
  export: null,

  queryParamsObserver: function () {
    if (this.get('export')) {
      this.exportFile()
      this.set('export', null)
    }
  }.observes('export'),

  // == Functions =============================================================
  exportFile () {
  },

  // == Actions ===============================================================
  actions: {
  }

})

但我的问题是,当我将查询参数设置为null时,它不会在网址上发生变化。我想知道我在这里失踪了什么并没有导致这种行为。 另外,我想知道使用观察查询参数是否是触发某些操作的最佳解决方案。

2 个答案:

答案 0 :(得分:1)

第一个选项,使用service并通过应用程序路径或按钮组件触发导出似乎更适合您的情况。您可以在所有路线中使用它。用户在导出时保持相同的路线。我会用这个选项。

第二个选项是将exportFile转换为thennable函数。导出完成后,您可以清除queryParams。以下是a working twiddle

答案 1 :(得分:1)

您的案例的问题与以下事实有关:您在控制器中设置export太早,查询参数更改未反映到网址。了解Ember.run循环并非易事。您应该通过阅读following来开始学习运行循环。

请查看以下twiddle,如果您将export中的Ember.run.scheduleOnce设置包含在旋转中,则会在网址中清除export 。 (实际上它会被立即删除;你永远不会看到它变为真;如果你将一个导出函数和export标志清除在一个承诺中;让我们说它会在几秒后解决;然后你会看到它会成为true然后将被移除。)

关于使用观察员的问题;我看不到你能用你当前的设计做什么。原因是;你是说refreshModel是假的;因此,如果您已在同一路径内,则路由中没有任何可用的钩子方法可以在控制器内触发export功能。你需要改变你的设计; ykaragol建议的可能是一个很好的起点。