Ember:全球可用的搜索组件(和操作)?

Ember: globally-available search component (and action)?

我想在一个组件内有一个搜索字段,它可以放置在应用程序的任何位置。它可以出现在任何模板上,也可以嵌套在组件中。搜索表单将接受用户输入(搜索词),submit 将触发一个搜索操作,该操作将转换为结果模板。

看起来很简单,但我不知道如何让一个动作全局可用。如果可以的话,你如何首先将输入的术语传递给动作?令人惊讶的是,关于如何使用 Ember CLI 处理表单提交的信息很少。

到目前为止,我一直在提交带有 action='/results' 的常规表单。但这显然是在重新加载应用程序。

我一直在像这样在索引控制器中创建一个动作:

export default Ember.Controller.extend(defaultParams, {
    term: '',
    actions: {
        keywordSearch() {
            this.transitionToRoute('results', { queryParams: { q: this.get('term') }});
        }
    }
});

然后将关闭操作向下传递到我的搜索组件,该组件嵌套在索引模板的 2 层深处。

index.hbs:

{{index-search keywordSearch=(action "keywordSearch")}}

index-search.hbs(分量):

{{search-field keywordSearch=keywordSearch }}

search-field.hbs(嵌套组件):

<form {{ action (action keywordSearch) on='submit' }}>
{{ input value=term }}
<button type="submit">Search</button>
</form>

这将 运行 动作,但未提供 term。您如何向关闭操作提供 term

而且...我真的需要将操作传递到搜索字段将出现在应用程序中的每个地方,还是有更简单的方法来做到这一点?

您可以创建一个搜索服务,而不是在所有组件和路由中编写操作。将服务注入组件并处理服务方法的路由转换。检查下面的示例代码,

搜索-component.hbs

<form {{ action (action search) on='submit' }}>
{{ input value=keyword }}
<button type="submit">Search</button>
</form>

搜索-component.js

export default Ember.Component.extend({

  globalSearch: Ember.inject.service('search'),

  actions: {
    search() {
      const { keyword } = this.getProperties('keyword');
      this.get('globalSearch').showResults(keyword).then(() => {
        alert('Success');
      }, (err) => {
        alert('Error while searching: ' + err.responseText);
      });
    }
  }

});

服务 - app/services/search.js

import Ember from 'ember';

export default Ember.Service.extend({

  init() {
    this._super(...arguments);
  },

  showResults(keyword) {
    // write code for transition to search results route here
  }
});