url 中未显示更改查询参数

Changing query param is not shown in the url

我想单击 "export" 按钮并转移到路线 "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 时,它不会在 url 上改变。我想知道我在这里遗漏了什么不会导致这种行为。 另外,我想知道使用观察查询参数是否是触发某些操作的最佳解决方案。

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

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

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

开始学习 运行 循环

看看下面的 twiddle,如果你把 export 的设置包裹在 Ember.run.scheduleOnce 中,就像在 twiddle 中那样,你会看到 export 被清除了url。 (事实上​​它会立即被删除;你永远不会看到它变成真的;如果你将导出函数和 export 标志的清除都包装在一个承诺中;假设这将在几秒钟后解决;那么你会看到它会成为 true 然后将被删除)。

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