【问题标题】:taking user input using a form and share that data into a different component for displaying it使用表单获取用户输入并将该数据共享到不同的组件中以显示它
【发布时间】:2019-09-01 19:03:52
【问题描述】:

我有一个表单字段接受用户输入的姓名、电子邮件、主题。现在,如何将这些数据共享给同一模块的不同组件以显示它。

<div class="jumbotron">
  <form [formGroup]="suggestForm" (ngSubmit)="onSubmit(suggestForm.value)">
      <div class="form-group">
          <input type="text" formControlName="name" class="form-control" id="exampleInputName"  placeholder="Full Name" [ngClass]="{ 'is-invalid': submitted && f.name.errors }">
          <div *ngIf="submitted && f.name.errors" class="invalid-feedback">
              <div *ngIf="f.name.errors.required">Name is required</div>
          </div>
        </div>
  <div class="form-group">
    <input type="email" formControlName="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email" [ngClass]="{ 'is-invalid': submitted && f.email.errors }">
    <div *ngIf="submitted && f.email.errors" class="invalid-feedback">
        <div *ngIf="f.email.errors.required">Email is required</div>
        <div *ngIf="f.email.errors.email">Email must be a valid email address</div>
    </div>
  </div>
  <div class="form-group">
      <input type="text" formControlName="subject" class="form-control" id="exampleInputSubject"  placeholder="What's the subject?" [ngClass]="{ 'is-invalid': submitted && f.subject.errors }">
      <div *ngIf="submitted && f.subject.errors" class="invalid-feedback">
          <div *ngIf="f.subject.errors.required">Subject is required</div>
      </div>
  </div>
  <div class="form-group">
      <textarea type="text" formControlName="story" class="form-control" id="exampleInputStory"  placeholder="What's the story?" [ngClass]="{ 'is-invalid': submitted && f.story.errors }">
          <div *ngIf="submitted && f.story.errors" class="invalid-feedback">
              <div *ngIf="f.story.errors.required">Story is required</div>
          </div>
      </textarea>
  </div>

  <button type="submit" class="btn btn-primary">Submit</button>
</form>

以上是接受用户输入的表单字段

    result: SuggestForm;
    suggestForm: FormGroup;
    submitted = false;

    ngOnInit() {
      this.suggestForm = this.formBuilder.group({
        name: ['', Validators.required],
        email: ['', [Validators.required, Validators.email]],
        subject: ['', Validators.required],
        story: ['', Validators.required]
      });
    }

    get f() { return this.suggestForm.controls; }

    onSubmit() {
      this.submitted = true;

      if (this.suggestForm.invalid) {
        return;
      }

      alert('SUCCESS!! :-)\n\n' + JSON.stringify(this.suggestForm.value));
      result = Object.assign({}, this.suggestForm.value);
      console.log(result);
    }


上面这段代码是angular中的component.ts文件

export class SuggestForm {
    name: string;
    email: string;
    subject: string;
    story: string;
  }

以上是SuggestForm.ts类

如何在不同的组件中使用该结果对象来显示输入值

【问题讨论】:

标签: angular typescript


【解决方案1】:

SuggestForm.ts

import 'MessageService' from './messageService.ts'
result: SuggestForm;
suggestForm: FormGroup;
submitted = false;

constructor(private msgSer: MessageService)
ngOnInit() {
  this.suggestForm = this.formBuilder.group({
    name: ['', Validators.required],
    email: ['', [Validators.required, Validators.email]],
    subject: ['', Validators.required],
    story: ['', Validators.required]
  });
}

get f() { return this.suggestForm.controls; }

onSubmit() {
  this.submitted = true;

  if (this.suggestForm.invalid) {
    return;
  }

  alert('SUCCESS!! :-)\n\n' + JSON.stringify(this.suggestForm.value));
  result = Object.assign({}, this.suggestForm.value);
  this.msgSer.setMessage(result);
  console.log(result);
}

为示例消息服务创建一个新服务

import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()

export class MessageService {
public message = new Subject<string>();
setMessage(value: string) {
   this.message.next(value); //it is publishing this value to all the subscribers 
   that have already subscribed to this message
  }
}

这里是订阅该主题的其他组件,因此无论何时设置结果,这些组件都会获得最新值。

coponentOne.ts

   ngOninit() {
    this.messageService.message.subscribe((message) => {
        console.log(message);
    });
   }

coponentTwo.ts

   ngOninit() {
    this.messageService.message.subscribe((message) => {
        console.log(message);
    });
   }

希望对你有所帮助。

【讨论】:

  • 我想知道,如何将那个“结果对象”作为行为主体,而不是字符串?
  • 您可以将该结果变量指定为 SuggestForm.ts 中的行为主题
  • 在component.ts文件中??还是在服役?
  • 服务中,正如您在我的回答中看到的那样
猜你喜欢
  • 1970-01-01
  • 2014-03-20
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多