Не можем ли мы поставить задачу параллельного выполнения ember в средство получения компонентов glimmer, которое отслеживает аргументы компонентов

- когда задача параллелизма ember называется getter компонентов glimmer, она выполняется в бесконечном цикле.

import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { task } from 'ember-concurrency';

export default class UserTableComponent extends Component {
  @service store;
  @tracked users;

  get taskStatus() {
    let params = {
      'account_id':this.args.account,
      'page':this.args.page
    }
    this.getUsersTask.perform(params);

  }


  @task(function*(params) {
      let recordsWithMeta = yield this.store.query('user', params);
      this.users= recordsWithMeta.toArray();
    }) getUsersTask;

}

пользовательские table.hbs

<table>
  <thead>
    <tr>
      <th>
        <div class="first">Name</div>
      </th>
    </tr>
  </thead>
  <tbody>
    {{#if this.taskStatus.isRunning}}
    <tr>
      <td >
        <div class="h-64">
          {{ui-kit/loader}}
        </div>
      </td>
    </tr>
    {{else}}
    {{#each @users as |user|}}

    {{/each}}
    {{/if}}
  </tbody>
</table>

Выше компонент вызывается где-то в шаблоне и прохождения динамической учетной записи и страницы.

<UserTable 
  @account={{this.account}}
  @page={{this.page}}
  >          
</UserTable>

Примечание: он работает в бесконечном цикле.

1 ответ

Я нашел две вещи для изменения. Но не уверен, что их будет достаточно, чтобы заставить его работать.

Первая точка,

{{#each @users as |user|}} эквивалентно this.args.users, Но users массив определяется на компоненте. Так что это должно быть изменено на {{#each this.users as |user|}}

Второй пункт,

taskStatus ничего не возвращает. Так {{#if this.taskStatus.isRunning}} будет false каждый раз. Правильная проверка будет {{#if this.getUsersTask.isRunning}}, так как isRunning это свойство задачи.
Но когда ты изменился на {{#if this.getUsersTask.isRunning}}не получится, так как никто не срабатывает getUserTask, Я думаю, что вы можете инициировать эту задачу в одном из хуков жизненного цикла (таких как didInsertElement).

Другие вопросы по тегам