【问题标题】:Problems sending information from one form to another component将信息从一个表单发送到另一个组件时出现问题
【发布时间】:2019-12-15 23:00:03
【问题描述】:

我正在尝试使用类和服务将我的表单信息发送到另一个组件,我已经尝试了几乎所有在谷歌上的东西,但对我来说仍然没有任何效果,当我开始时,这个动作对我来说有点复杂在 angula,你可以给我一些想法,让我知道如何做到这一点,而不用做这么复杂,这是我的代码:

User.Services.ts

import { Injectable } from "@angular/core";
import { Usuario } from "../model/usuario";
import { Observable, Subject } from "rxjs";

@Injectable()
export class UsuarioServices {
  public usuario: Array<Usuario>;
  private subject = new Subject<any>();
  constructor() {
    //Iniciamos el mensaje para que pueda tener contenido

  }

   public sendInfo(
      name: String, lastname: String, direction: String, apt: String, country: String, cardtype: String,
      cardnumber: any, cvc: any, month: any, year: any, email: any, checkbox: any
    ):Array<Usuario>{

      this.subject.next(this.usuario=[new Usuario(name, lastname, direction, apt, country,
        cardtype, cardnumber, cvc, month, year, email, checkbox)])

      return this.usuario;
    }

  clearMessage() {
    this.subject.next();
  }

  getMessage(): Observable<any> {
    return this.subject.asObservable();
  }
}

获取表单信息的组件:

import { Component, OnInit } from "@angular/core";
import {
  AbstractControl,
  FormBuilder,
  FormGroup,
  Validators,
  ControlContainer
} from "@angular/forms";
import { Usuario } from "../../model/usuario";
import { UsuarioServices } from "../../Services/usuario.service";

@Component({
  selector: "app-data-form",
  templateUrl: "./data-form.component.html",
  styleUrls: ["./data-form.component.css"],
  providers: [UsuarioServices]
})
export class DataFormComponent implements OnInit {
  public formGroup: FormGroup;
  private firstname: String;
  private lastname: String;
  private direction: String;
  private apt: String;
  private country: String;
  private card_type: String;
  private card_number: any;
  private cvc: any;
  private month: any;
  private year: any;
  private email: any;
  private checkBoxValue: any = false;
  public userdos: Array<Usuario>;

  constructor(
    private formBuilder: FormBuilder,
    private _UsuarioServices: UsuarioServices
  ) {}

  ngOnInit() {
    this.buildForm();
  }

  private buildForm() {
    this.formGroup = this.formBuilder.group({
      name: [this.firstname, Validators.required],
      lastname: [this.lastname, Validators.required],
      email: [this.email, [Validators.email, Validators.required]],
      addres: [this.direction, Validators.required],
      apt: [this.apt, Validators.required],
      tel: ["", [Validators.required, this.validatePassword]],
      country: [this.country, Validators.required],
      cardtype: [this.card_type, Validators.required],
      number: [this.card_number, Validators.required],
      cvc: [this.cvc, Validators.required],
      month: [this.month, Validators.required],
      year: [this.year, Validators.required]
    });
  }

  public send() {
    var user = this.formGroup.value;
    this.userdos = this._UsuarioServices.sendInfo(user.name,user.lastname,user.addres,user.apt,
      user.country,user.cardtype,user.number,user.cvc,user.month,user.year,user.email,this.checkBoxValue
    );

    //  console.log(this.datainfo.Getfirstname);
  }

}

我尝试接收信息的组件:

import { Component, OnInit, OnDestroy } from "@angular/core";
import { Usuario } from "../../model/usuario";

import { UsuarioServices } from "../../Services/usuario.service";

import { Subscription } from "rxjs";

@Component({
  selector: "app-card",
  templateUrl: "./card.component.html",
  styleUrls: ["./card.component.css"],
  providers: [UsuarioServices]
})
export class CardComponent implements OnDestroy {
  public message: any;
  public subscription: Subscription;

  constructor(private _UsuarioServices: UsuarioServices) {

    this.subscription = this._UsuarioServices.getMessage()
      .subscribe(message => { this.message = message; });
      console.log(this.message);
  }


  ngOnDestroy() {

    this.subscription.unsubscribe();
  }

}

【问题讨论】:

  • 请注意,在引用的答案中,服务 不是 provided 在组件级别(通过添加类型信息 providers i> 装饰器中的数组)
  • 哦,我该如何解决?

标签: angular angular7 angular8


【解决方案1】:

这就是Subject 的工作原理,在您的情况下,您可以使用BehaviorSubject

一个 BehaviorSubject 拥有一个值。当它被订阅时,它会发出 立即值。 Subject 没有值。

尝试使用:

private subject = new BehaviorSubject<any>(null);

代替

private subject = new Subject<any>();

更多详情:DO READ


SAMPLE DEMO(同样的问题)

用于测试打开user.service.ts

两种方法都试一下

private myUser = new BehaviorSubject(null);

private myUser = new Subject&lt;any&gt;();

【讨论】:

  • @StevenColocho,很高兴知道,快乐编码顺便说一句:)
  • 您的演示不是对 OP 情况的准确再现。还有另一个因素导致了这个问题。此外,您正在举例说明一种非常糟糕的做法:手动订阅但没有取消订阅全球服务。
  • @Jota.Toledo,这就是为什么我将它命名为示例演示,因为“但没有取消订阅”他已经完成了它,并且在我的演示中它与 html 绑定,因此需要取消订阅自动处理跨度>
  • 这毫无意义,你能重新表述吗?无论如何,如果您改进答案以消除反对票,请联系我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多