0

我想单击“导出”按钮并转换到“导出”查询参数设置为 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 上更改。我想知道我在这里缺少什么不会导致这种行为。另外,我想知道使用观察查询参数是否是触发某些操作的最佳解决方案。

4

2 回答 2

1

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

第二种选择是将 转换exportFilethennable函数。导出完成后,您可以清除 queryParams。这是一个适合你的工作。

于 2017-04-09T19:42:47.930 回答
1

您的案例的问题与您export在控制器内的设置太早以至于查询参数更改未反映到 url 的事实有关。了解 Ember.run 循环并非易事。您应该通过阅读以下内容开始了解运行循环。

看看下面的twiddle,如果你把 inside 的设置包装exportEmber.run.scheduleOncetwiddle 那么你会看到exporturl 中清除了。(实际上它会立即被删除;你永远不会看到它正在变成真的;如果你将导出功能和清除export标志都包装在一个承诺中;假设这将在几秒钟后解决;那么你会看到它会变成true然后将被删除)。

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

于 2017-04-10T08:05:13.887 回答