【问题标题】:Angular2 , Create Model on runtimeAngular2,在运行时创建模型
【发布时间】:2019-07-21 00:34:04
【问题描述】:

我是 angular2 新手,有没有办法在运行时创建模型(或类)。

标准技术是在单独的文件中声明它,例如 Hero.ts、Customer.ts、Salesman.ts 等

但由于应用程序的性质,它自身的数据库结构经常会发生变化。

我们使用 WebAPI 获取字符串 JSON 格式的模型/类结构并基于下载的 JSON 字符串在运行时创建它的策略。

我们如何在 TypeScript 中完成?

谢谢

【问题讨论】:

  • 考虑不使用模型?在 http 响应中自己解析/构造对象。
  • 如何“解析/构造对象”请任何方向
  • btw atm ,我在 http.get 中使用任何,但我坚持如何 2 方式绑定它,其余的 POST/PUT/DELETE。请帮助如何“在 http 响应中自己解析/构造对象”
  • 好吧...使用 Angular 的 HttpClient,this.http.get(url),您可以获得 JSON 响应(作为可观察的)。如果您想要用于纯数据操作的模型,您可以在代码中简单地使用这个普通的 JS 对象,而没有 TS 的限制和便利。为什么您真的需要将数据包装在模型中?
  • 如果你有 200 多张桌子,我不明白你为什么“需要”模型。可以发一些代码吗?

标签: angular class model runtime


【解决方案1】:

您的数据库结构经常变化?听起来很令人兴奋。 :) 我会为您提到的每个模型创建一个接口,但将属性标记为可选:

export class Hero {
  name: string;
  age?: string;
  sex?: string;
}

然后,您可以从 HTTP 响应中获取对象并说它们是 Hero 类型。

【讨论】:

  • 嗯,这可以解决问题,但我们总共有 200 多个表,大约 >1000 多个字段
  • 当我遇到同样的情况时,我只是将响应放入一个可以从响应 JSON 生成打字稿接口的工具中。有很多工具可以做到这一点,还有一个VS Code plugin。另一次,我使用了一个 Maven 插件,它可以从我们的 Java Rest API 生成 TypeScript 接口。我假设您可以为任何语言找到类似的内容。
  • 感谢您的信息,我们也可以使用 tsql 直接从数据库生成 typescript 接口(我们自己开发的客户端+服务器 webapi),并将其复制并粘贴到 .ts 文件中。但问题是我们不想在每次数据库结构发生变化时都这样做。抱歉让我自己不够清楚
【解决方案2】:

啊……它实际上是在英雄之旅文档的开头,类型检查之前。链接:https://angular.io/guide/http#getting-json-data

类型检查不是必需的。只是推荐。

演示

操作 JSON 对象:

使用可观察对象(异步)

a.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class AService {
  constructor(private http: HttpClient) { }

  getData() {
    return this.http.get('http://something.com/api'); // Returns an observable
  }
}

a.component.ts

export class AComponent {
  constructor(private service: AService) { }

  doSomething() {
    this.service.getData().subscribe((data) => {
      // do things here
    });
  }
}

使用 Promise 和 async/await(同步)

如果请求是一次性请求,并且不需要操作 observable 中的数据,可以使用 Promises 和 async/await 来编辑原始 JS 对象数据:

a.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class AService {
  constructor(private http: HttpClient) { }

  getData() {
    return this.http.get('http://something.com/api').toPromise(); // Returns a promise
  }
}

a.component.ts

export class AComponent {
  constructor(private service: AService) { }

  async doSomething() {
    const data = await this.service.getData();
    // do things here
  }
}

【讨论】:

  • Getdata 没问题,从Http.Get 用whatever/no type 获取后,直接显示成Html 即可。但是现在如何从 Http.Get "Bindable" 制作结果,编辑并发布回来?
  • 这是我的 modif 从示例中获取:getHero(id: string): Observable { return this.http.get('localhost:5832/api/heroes/') );但是...... addHero (hero: any): Observable { return this.http.post('localhost:5832/api/heroes', hero, httpOptions) ) } 不起作用...... .
  • 您的服务器 API 是否接受 get 和 post 请求?你能提供一个 Stackblitz 吗?
  • 是的,默认 5 个请求,1. GetRows 用于返回多行,2. GetRow 用于返回 1 行,3. 添加运行 POST(insert),4. 更新运行 PUT,dan 5. 删除运行删除
  • 我还在学习如何使用 Stackblitz,将我的代码发布到云端(实际上是我第一次听说 :))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多