Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度8:将形状标记为从父组件接触_Angular_Typescript_Angular8_Angular Reactive Forms - Fatal编程技术网

Angular 角度8:将形状标记为从父组件接触

Angular 角度8:将形状标记为从父组件接触,angular,typescript,angular8,angular-reactive-forms,Angular,Typescript,Angular8,Angular Reactive Forms,如何声明从父组件接触的子组件表单标记 目前在子组件中,我们有一个输入变量和ngOnChanges @Input public markFormTouchedFlag: boolean if (this.markFormTouchedFlag) { this.addressform.markAllAsTouched(); } 奇怪的是,是否有一种更有效的方法使子组件窗体(addressform)与父组件相接触 也许应该让问题更一般化,找到formvalidity,markuntouc

如何声明从父组件接触的子组件表单标记

目前在子组件中,我们有一个输入变量和ngOnChanges

@Input public markFormTouchedFlag: boolean

if (this.markFormTouchedFlag) { 
    this.addressform.markAllAsTouched();
}
奇怪的是,是否有一种更有效的方法使子组件窗体(addressform)与父组件相接触


也许应该让问题更一般化,找到formvalidity,markuntouched,但我只会坚持第一个问题。

如果需要将同一个变量(“markFormTouchedFlag”)传递给多个组件,您可以使用这种方法。此方法将数据存储在可观察对象中,并通过订阅此方法将自动更新变量(无论何时使用)

创建用于存储数据的服务:

import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';

@Injectable({ providedIn: 'root' })
export class FlagService {
    private subject = new Subject<any>();

    updateFlag(flag: bool) {
        this.subject.next({ flag: flag });
    }

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

    getFlag(): Observable<any> {
        return this.subject.asObservable();
    }
}
在这个组件(父组件)中,我们有两个函数set和clear flagSetflag功能用于设置服务中的值。一旦在订阅了ever值的服务层中设置了它,它将被更新clearFlag函数用于设置具有空值的变量

子组件:

import { Component, OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs';

import { FlagService } from '../services/FlagService.service';

@Component({
    selector: 'app',
    templateUrl: 'app.component.html'
})

export class AppComponent implements OnDestroy {
    flag: any;
    subscription: Subscription;

    constructor(private flagService: FlagService) {}

    setFlag(): void {
     this.flagService.sendFlag(flag);
   }

   clearFlag(): void {
       this.messageService.clearMessage();
   }
}
import { Component } from '@angular/core';

import { FlagService } from '../services/FlagService.service';

@Component({ templateUrl: 'home.component.html' })
export class HomeComponent {

 flag: any;
 subscription: Subscription;

 constructor(private flagService: FlagService) {
     this.subscription = this.flagService.getMessage().subscribe(flag => { this.flag = flag; });
 }

 ngOnDestroy() {
     this.subscription.unsubscribe();
 }
通过这种方式,您可以从observable中获取值,每当标志在服务中更改时,它将在父组件中更改后在子组件中自动更新,并且由于构造函数中的订阅,它将在组件中设置为flag


在组件销毁时,我们正在取消对值的订阅。

因此,当您从Parents传递markFormTouchedFlag=true时,上述方法是否有效?我希望上述方法有效,如果您想使其动态,只需创建observable类型的变量,并发送更新的值,您必须在子组件中侦听该值,并根据需要对其进行触摸。是的,上述方法正在工作,不知是否有更有效的方法似乎我们正在与服务紧密结合,也有许多用于触摸表单的代码,不过我会查看,谢谢