首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ngrx-data如何配置应用程序从特定的urls获取特定实体的数据

使用ngrx-data如何配置应用程序从特定的urls获取特定实体的数据
EN

Stack Overflow用户
提问于 2020-06-07 01:24:06
回答 1查看 1.3K关注 0票数 3

如果我们遵循ngrx数据示例并查看实体DataService,我们可以在没有任何配置的情况下获取内存中的英雄数据(硬编码)。默认值的工作方式与我们配置的相同:

代码语言:javascript
复制
const defaultDataServiceConfig: DefaultDataServiceConfig = {
  root: 'api',      // or a running server url, e.g: 'http://localhost:4000/api'
  timeout: 3000,    // request timeout
}

例如: EntityStoreModule

代码语言:javascript
复制
@NgModule({
  providers: [{ provide: DefaultDataServiceConfig, useValue: defaultDataServiceConfig }]
})

问题:

我们将如何配置我们的应用程序从默认源获取实体"Heros“的数据:

代码语言:javascript
复制
root: 'api'

以及来自URL的实体"Villans“的数据:

代码语言:javascript
复制
root: 'http://localhost:4000/villans'

以及其他实体(其他/各种)各自网址的数据.?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-07 15:57:15

在特别地回顾了文档:自定义EntityDataService替换HttpUrlGenerator之后,我想出了这个解决方案。任何人都可以发表评论。

  1. 定义/审查您的数据类型-实体元数据-实体名称;
  2. 为非默认的复数实体名称创建到复数的映射(默认值为: name + 's');
  3. 对于具有非默认根URL的实体,创建实体名称到特定URL的映射;

档案:../entity-metadata.ts

代码语言:javascript
复制
                             // Step 1:
const entityMetadata: EntityMetadataMap = {
    Hero: {},
    Villan: {},
    Creature: {},
    DataA01: {}
    // etc.
}

                             // Step 2:
const pluralNames = {
    Hero: 'heroes',
    DataA01: 'data-a01'
}

export const entityConfig = {
    entityMetadata,
    pluralNames
};

                             // Step 3:
export const rootUrls = {
 // Hero:        - not needed here, data comes from default root
    Villan:      'http://localhost:4001',
    Creature:    'http://localhost:4001',
    DataA01:     'http://remoteserver.net:80/publicdata',
}
  1. 将HttpUrlGenerator (文档)替换为您自己的URL生成器(DynamicHttpUrlGenerator)

文件:../http-dyn-url-generator.ts

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import {
  DefaultHttpUrlGenerator,
  HttpResourceUrls,
  normalizeRoot,
  Pluralizer,
  DefaultPluralizer,
} from '@ngrx/data';
import { rootUrls } from '../data/ngrx-data/db01-entity-metadata';



@Injectable()
export class DynamicHttpUrlGenerator extends DefaultHttpUrlGenerator {

  constructor(private aPluralizer: Pluralizer = new DefaultPluralizer(undefined)) {
    super(aPluralizer);
  }

  protected getResourceUrls(entityName: string, root: string): HttpResourceUrls {
    let resourceUrls = this.knownHttpResourceUrls[entityName];
    if ( ! resourceUrls) {
                            // rootUrls contains
                            // mapping of individual ngrx data entities 
                            // to the root URLs of their respective data sources.
                            // It contains only entities which do not have
                            // the default root URL.
      if (rootUrls.hasOwnProperty(entityName)) {
         root = rootUrls[entityName];
      }
      const nRoot = normalizeRoot(root);
      const url = `${nRoot}/${this.aPluralizer.pluralize(entityName)}/`.toLowerCase();

                            // remove after testing
console.log('-- entityName: ' + entityName + ', URL: ' + url)

      resourceUrls = {
          entityResourceUrl: url,
          collectionResourceUrl: url
      };
      this.registerHttpResourceUrls({ [entityName]: resourceUrls });
    }
    return resourceUrls;
  }
}
  1. 为每个数据实体创建一个自定义EntityDataService
代码语言:javascript
复制
- HeroDataService
- VillanDataService
- CreatureDataService
- DataA01DataService
- etc.

(医生和密码在这里) -代码示例如下

//存储/实体/英雄-数据服务

  1. 在您的应用程序模块中注册您的DynamicHttpUrlGenerator和自定义EntityDataServices,在我的例子中:

文件:../ngrx-data-store.module.ts

(在一个简单的应用程序中,直接在文件:app.module.ts中)

代码语言:javascript
复制
@NgModule({
    imports: [ ... ],
    providers: [ { provide: HttpUrlGenerator, useClass: DynamicHttpUrlGenerator },
                 HeroDataService,
                 VillanDataService,
                 CreatureDataService,
                 DataA01DataService
               ]
 })
  1. 在组件中为每个给定实体使用自定义EntityDataServices的方式与所有标准或默认EntityDataServices提取数据的方式相同。数据将从您在const: rootUrls中设置的相应URL中提取。不要忘记配置和启动URL的数据服务器。
  2. 几个重要的考虑因素:
代码语言:javascript
复制
- on your server you may need to enable CORS handling. E.g: on nestjs use:

app.enableCors();

代码语言:javascript
复制
- if your client app uses: Angular in-memory-web-api you need to enable access to remote server as follows:

文件:../in-mem-data.module.ts (或按您的名称)

代码语言:javascript
复制
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api';
import { InMemDataService } from '../../services/data/in-mem-data/in-mem-data.service';

@NgModule({
 imports: [
   HttpClientModule,
   HttpClientInMemoryWebApiModule.forRoot(InMemDataService, {
      passThruUnknownUrl: true   // <--- IMPORTANT for remote data access
    }),
 ]
})
export class InMemDataModule {}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62239876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档