Не можем ли мы поставить задачу параллельного выполнения 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
).