如何呈现和过滤来自@参数的数据集合?

gdrx4gfi  于 2022-10-20  发布在  其他
关注(0)|答案(1)|浏览(135)

这个问题来自我们的Ember Discord
我有这样的东西

{{#each @data as |project|}}
  <ItemList @categories={{project.category}}/>
{{/each}}

我在其他地方调用action,然后过滤@数据,我想重置each @data
我想将筛选结果分配给从父组件传递给此的@data数据
在同一个组件上我有按钮

<li 
  class="inline hover:underline cursor-pointer ml-4" 
  {{on "click" (fn this.changeProject project.name @data)}}
>
  {{project.name}}
</li>

changeProject操作过滤了我想重新分配给#each的@数据,例如-this.data = filteredModel;不起作用。

6ojccjat

6ojccjat1#

假设您的操作,changeProject看起来像这样:

@action
changeProject(projectName, data) {
  this.data = data.filter(project => project.name.includes(projectName));
}

this.data不工作的观察是正确的,也是有意的,因为@datathis.args.data上可用,但this.args的每个键都是不可变的。
因此,在组件中,为了引用过滤后的数据,可能需要创建一个别名:

get filteredData() {
  return this.args.data;
}

在模板中:

{{#each this.filteredData as |project|}}
  ...

然后您的操作也需要更新,因为我们仍然无法设置filteredData*或this.args.data

import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';

export default class Demo extends Component {
  @tracked filtered;

  get filteredData() {
    return this.filtered ?? this.args.data;
  }

  @action
  changeProject(projectName) {
    this.filtered = this.args.data.filter(project => project.name.includes(projectName));
  }
}
{{#each this.filteredData as |project|}}
  <ItemList @categories={{project.category}}/>
{{/each}}

...
<ul>
  {{#each @data as |project}}
    <li 
      class="inline hover:underline cursor-pointer ml-4" 
      {{on "click" (fn this.changeProject project.name)}}
    >
      {{project.name}}
    </li>
  {{/each}}
</ul>

相关问题