如何在没有计算的情况下跟踪其他getter中的getter更改-Ember js

sxpgvts3  于 2022-09-28  发布在  其他
关注(0)|答案(1)|浏览(148)

我需要跟踪getter是否加载到其他没有@computed属性的getter中。我该怎么办?

@computed('current.locationId')
get currentApplications() {
  const query = {
    locationID:     get(this, 'current.locationId')
  };

  return this.store.pagedArray(this.store.query('shift-application', query));
}

get applicationsLoaded() {
  return this.currentApplications.isFulfilled
}

我需要跟踪currentApplications.isFulfilled而不使用e1d1e

pjngdqdw

pjngdqdw1#

您在跟踪getter中承诺的结果时会遇到问题(不管是否计算),不过有几个库可以帮助您解决这个问题,我强烈建议您使用其中的一个库,因为这样做您自己可能会变得复杂和错误。
原因是,在处理网络数据时,必须对错误状态、加载状态等进行建模。

ember资源

GitHub-Docs
这个库为Ember提供了一个新的React性原语,希望将来成为框架中的默认原语。
在其中一个示例中,您可以在远程请求bi的整个生命周期中提供跟踪状态,如下所示:

import { resource } from 'ember-resources';
import { TrackedObject } from 'tracked-built-ins';

const load = resource(({ on }) => {
  let state = new TrackedObject({});
  let controller = new AbortController();

  on.cleanup(() => controller.abort());

  fetch(this.url, { signal: controller.signal })
    .then(response => response.json())
    .then(data => {
      state.value = data;
    })
    .catch(error => {
      state.error = error;
    });

  return state;
})

<template>
  {{#let (load) as |state|}}
    {{#if state.value}}
      ...
    {{else if state.error}}
      {{state.error}}
    {{/if}}
  {{/let}}
</template>

来自本页:https://ember-resources.pages.dev/functions/index.resource-1
此外,README和documented here上还提供了一个实用程序
b1a1ab

{{this.records}}

它提供了以下属性以在模板中使用:https://ember-resources.pages.dev/classes/util_function.State
RemoteData是一个示例,说明了如何构建自己的带参数的资源,如果愿意的话:https://ember-resources.pages.dev/functions/util_remote_data.RemoteData

ember数据资源

GitHub
因为看起来您正在使用ember数据,所以您可能对ember的数据资源中的这个实用程序感兴趣——它提供了许多您需要处理的中间状态。

import { query } from 'ember-data-resources';

export default class MyComponent extends Component {
  blog = query(this, 'blog', () => ({ ...query }));
  // other examples
  // blog = query(this, 'blog', () => [{ ...query }]);
  // blog = query(this, 'blog', () => [{ ...query }, { ...options }]);
}
Available properties:
 - {{this.blog.records}}
 - {{this.blog.error}}
 - {{this.blog.isLoading}}
 - {{this.blog.isSuccess}}
 - {{this.blog.isError}}
 - {{this.blog.hasRun}}

Available methods:
 - <button {{on 'click' this.blog.retry}}>Retry</button>

该库建立在e1d1e之上。

ember异步数据

GitHub
这与“资源”非常相似,因为资源“字面上只是助手”(但在JS中有一些更好的人机工程学用于互操作)。
README有一些可靠的示例,还有一个类似的API
(这是自述文件的摘录)
在仅限模板的代码中以声明方式呈现承诺:

{{#let (load @somePromise) as |result|}}
  {{#if result.isResolved}}
    <PresentTheData @data={{result.value}} />
  {{else if result.isPending}}
    <LoadingSpinner />
  {{else if result.isRejected}}
    <p>
      Whoops! Looks like something went wrong!
      {{result.error.message}}
    </p>
  {{/endif}}
{{/let}}

基于支持类中组件的参数创建声明性数据获取:

import Component from '@glimmer/component';
import { cached } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { TrackedAsyncData } from 'ember-async-data';

export default class SmartProfile extends Component {
  @service store;

  @cached
  get someData() {
    let recordPromise = this.store.findRecord('user', this.args.id);
    return new TrackedAsyncData(recordPromise);
  }
}

(请参阅下面的指南,了解为什么使用@cached!)

{{#if this.someData.isResolved}}
  <PresentTheData @data={{this.someData.value}} />
{{else if this.someData.isPending}}
  <LoadingSpinner />
{{else if this.someData.isRejected}}
  <p>
    Whoops! Looks like something went wrong!
    {{this.someData.error.message}}
  </p>
{{/endif}}

其他和参考

相关问题