将数据从服务传递到组件 --> 子组件

2023-12-02

简而言之,我正在使用这个Plunker我有一个场景,我必须通过从服务读取元素数据来动态创建控件。因此,当我从服务读取数据时,它是异步的。但是我必须根据从服务接收的数据创建一些具体对象并将其传递给子组件。所以这是我的逻辑

主要组件的 Html 如下。

   <ion-content padding class="container" *ngIf="questions"> 

   <app-dynamic-form [questions]="questions"></app-dynamic-form>

   </ion-content>

主要组件的类如下

Class ComponentMain{

   @Input() questions: QuestionBase<any>[]=[];
  constructor(public navCtrl: NavController, public navParams: NavParams,private qcs: Service)
    {
      qcs.getQuestions(this.parameter1.$key).subscribe(result => this.questions = result);
    }

}

子组件 Html 如下。

<div *ngIf="form">
  <form (ngSubmit)="onSubmit()" [formGroup]="form">

    <div *ngFor="let question of questions" class="form-row">
      <div *ngIf="question">
        <app-question [question]="question" [form]="form"></app-question>
      </div>
   </div>
</form>
</div>

子组件如下

Class ChildComponent implements AfterViewInit {

  @Input() questions: QuestionBase<any>[] = [];

 Constructor(){

  }

 ngAfterViewInit(){

 this.form = this.qcs.toFormGroup(this.questions);

 }

}

有第二个子组件,它依赖 childComponent 来创建控件。因此,控件仅在第二个子组件的 ngOnit 中填充,因此不会创建控件。我尝试使用许多生命周期钩子,例如 OnInit、OnChanges 等。但它们都没有真正给我结果。我确信我错过了一些我无法弄清楚的东西。

Class Service(){

questions: QuestionsData<any>[]=[];

getQuestions(FormKey: string) {

var dbQuestions = this.af.list('/elements', {
   query: {
   limitToLast: 200,
   orderByChild: 'formid',
   equalTo: FormKey
  }
})

  dbQuestions.subscribe(snapshots=>{
  snapshots.forEach(elementData => {
  this.questions.push(new TextboxQuestion({
        key: elementData.elementname,
        label: elementData.displaytext,
        value: elementData.elementvalue,
        required: false,
        order: elementData.sortorder
      }))
  }
 }
}

看这个例子Angular.io - 动态表单,它本质上是在运行时根据元数据构建表单。

有一些评论表明该示例尚未完成。

@Injectable()
export class QuestionService {

  // Todo: get from a remote source of question metadata
  // Todo: make asynchronous
  getQuestions() {
  ...

这些是我完成它并清除错误消息所采取的步骤。


问题.service.ts

Changed getQuestions异步返回问题。

Injectable()
export class QuestionService {

  constructor(
    private http: Http
  ) {}

  getQuestions$() {
    const url = 'https://api.myjson.com/bins/d0srd';
    return this.http.get(url)
      .map(response => response.json())
      .map(questionMetadata => this.metadataToQuestions(questionMetadata))
      .map(questions => questions.sort((a, b) => a.order - b.order))
  }

  private metadataToQuestions(questionMetadata) {
    return questionMetadata.questions.map(this.toQuestion)
  }

  private toQuestion(elementData) {
    // expand for additional control types
    return new TextboxQuestion({
      key: elementData.elementname,
      label: elementData.displaytext,
      value: elementData.elementvalue,
      required: false,
      order: elementData.sortorder
    })
  }
}


应用程序组件.ts

改变的变量questions类型为可观察的,向模板添加了异步管道。

@Component({
  ...
  template: `
    <div>
      <h2>Job Application for Heroes</h2>
      <app-dynamic-form [questions]="(questions$ | async)"></app-dynamic-form>
    </div>
  `,
  ...
})
export class AppComponent implements OnInit {

  questions$: Observable<any>;

  constructor(
    private questionService: QuestionService
  ) {}

  ngOnInit() {
    this.questions$ = this.questionService.getQuestions$();
  }
}


动态表单.component.ts

更改了@Input变量questions设置/获取样式,处理初始空值。
更改了创建表单的钩子ngOnInit to ngOnChanges处理问题的异步到达。

export class DynamicFormComponent implements OnChanges {

  private _questions = [];
  @Input() 
  set questions(value: any[]) {
    this._questions = value || [];
  }
  get questions(): any[] {
    return this._questions;
  }

  ...

  ngOnChanges() {
    this.form = this.qcs.toFormGroup(this.questions);
  }

}


动态表单问题.component.ts

添加额外的检查isValidgetter 以确保正在验证的控件存在。

export class DynamicFormQuestionComponent {
  ...
  get isValid() { return this.form.controls[this.question.key] 
    ? this.form.controls[this.question.key].valid : true; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数据从服务传递到组件 --> 子组件 的相关文章

随机推荐

  • 添加同一表的多个列的条件计数

    我正在寻找一种 更好 的方式来执行查询 在该查询中我想向单个玩家显示他之前玩过的游戏以及每个此类对手的相关胜负记录 以下是所涉及的表格 精简为要点 create table player player id int username tex
  • 如何将 Int 与无符号字节相互转换

    我需要将数字转换为无符号字节 该数字始终小于或等于 255 因此它将适合一个字节 我还需要将该字节转换回该数字 我将如何在 Java 中做到这一点 我尝试了多种方法 但没有一个有效 这就是我现在正在尝试做的事情 int size 5 Con
  • 在任何(未捕获的)异常上打开 IPython shell [重复]

    这个问题在这里已经有答案了 我在 Python 中定义了以下 嵌入式 shell from IPython config loader import Config cfg Config prompt config cfg PromptMan
  • Objective C 语法中 * 的使用

    我在一些 Objective C 语法上遇到了一些困难 有人可以详细说明以下实例方法中 的用法吗 IBAction sliderChanged id sender UISlider slider UISlider sender 我意识到我们
  • 三星齿轮伴侣应用深度链接

    我正在为 Samsung Gear 开发一个本机 C 应用程序 它也使用 Android 配套应用程序 我的应用程序因缺少配套应用程序的深层链接而被拒绝 我发现我应该在 tizen manifest xml 中包含这个标签
  • 替换 pandas 数据框中的括号[重复]

    这个问题在这里已经有答案了 我使用了下面的代码 input table input table replace to replace value 替换整个数据框中的括号 但令我惊讶的是 它不起作用 可能出了什么问题 Need regex T
  • Froogaloop2 库/API 是否仍受支持?

    在过去的几天里 我开始在我们的两个网站上播放视频 vimeo 视频 时遇到问题 我使用 Froogaloop2 API 库 突然间我无法搜索和播放视频 视频就停滞了 Froogaloop2 库最近发生了什么事吗 它仍然受支持吗 Thanks
  • 获取当前位置的国家/地区和时间戳

    我想知道我的应用程序在哪里使用 这是获取国家 地区名称的代码 public string Country RegionInfo CurrentRegion DisplayName 这是获取时区的代码 public void TimeStam
  • H264视频起始码的使用

    我对 H264 视频的起始代码 0x00 0x00 0x00 0x01 的使用有一般性问题 我不清楚这个起始代码的用法 因为在与 H264 视频相关的 RTP RFC 中没有参考 但我确实在网上看到了很多参考资料 特别是在 stackove
  • 预测 sprintf( ) 行的长度?

    是否有一个函数可以用来预测 sprintf 需要的空间 IOW 我可以调用函数 size t Predict space s n some string 来返回 sprintf s n some string 结果的 C 字符串的长度吗 I
  • 旋转 matplotlib 颜色图

    The ProPlotPython 包向 Matplotlib 库添加了附加功能 包括颜色图操作 对我来说特别有吸引力的一项功能是旋转 移动色彩图的能力 举个例子 import proplot as pplot import matplot
  • UI 到 HTML,转换不会将日期写入工作表

    我正在尝试复制 Pieter Jaspers 提出的关于将表单从 UIApp 转换为 HTML 的问题 原来的问题是 Pieter Jaspars 提出的原始问题由 Sandy Good 回答 如果我完全复制代码 我会得到正确的结果 但是当
  • Android:NPE,同时尝试使用 ACTION_APPWIDGET_PICK 意图的 ActivityForResult

    我有一个问题然后试图表达意图AppWidgetManager ACTION APPWIDGET PICK正如我从日志中看到的那样 Android AppWidget 生态系统内部存在问题 那我做错了吗 请参阅下面的示例代码和堆栈跟踪 pub
  • Django 服务器代码未更新

    我的服务器上正在运行一个广泛的程序 出现错误的行如下所示 result 0 update dictionary result 0 好像 label key value 所以我收到一个错误说tuple不具有update 当我把它固定为resu
  • C语言中如何找出最接近某个数的值?

    我在 C 中有以下代码 define CONST 1200 int a 900 int b 1050 int c 1400 if A CLOSEST TO CONST do something 检查 a 是否是 a b 和 c 中最接近 C
  • 使用 VSTS 任务将 UWP 应用程序分发到应用程序中心(又名移动中心)

    我目前正在与 Microsoft 合作解决您的一个 UWP 应用程序在启动后崩溃的案例 经过对 msbuild 的大量调试后 我认识到只有当生成的 appxbundle 文件通过 Microsoft App Center 又名移动中心 分发
  • D3js SVG 打开线条显示填充伪影,如何修复?

    I just added French rivers lines to my D3js generated SVG It now display a result like 我需要在没有神器的情况下保持河流线 数据 由弧组成的 topojs
  • Powerpoint编辑如何将一个形状从一张幻灯片复制到另一张幻灯片

    我是 C 编程的新手 我只是对整个 MS Office 库感到困惑 我想从幻灯片 3 中复制文本框并将其粘贴到幻灯片 2 中 我按照找到的页面中的说明进行操作 如何在 C 中将形状从一张幻灯片复制到另一张幻灯片 presentation S
  • libz.so.1:无法打开共享对象文件

    我在 ubuntu 12 04 上遇到一个问题 usr lib ndk android ndk r8c toolchains arm linux androideabi 4 6 prebuilt linux x86 bin lib gcc
  • 将数据从服务传递到组件 --> 子组件

    简而言之 我正在使用这个Plunker我有一个场景 我必须通过从服务读取元素数据来动态创建控件 因此 当我从服务读取数据时 它是异步的 但是我必须根据从服务接收的数据创建一些具体对象并将其传递给子组件 所以这是我的逻辑 主要组件的 Html