Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.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
Forms 从父窗体调用时获取子窗体数据_Forms_Angular_Typescript_Call - Fatal编程技术网

Forms 从父窗体调用时获取子窗体数据

Forms 从父窗体调用时获取子窗体数据,forms,angular,typescript,call,Forms,Angular,Typescript,Call,嗨,我有一个关于Angular 2的问题,我真的不知道怎么做,我需要你的帮助:) 我有一个子组件,它有一个简单的注册表,但是父模板上的submit按钮。因此,当我按下submit按钮时,它将从子组件表单中获取数据 这是我的例子 父组件ts import {Component, ViewChild, OnDestroy, Output, EventEmitter} from '@angular/core'; import {GlobalEvent} from 'app/shared/GlobalE

嗨,我有一个关于Angular 2的问题,我真的不知道怎么做,我需要你的帮助:)

我有一个子组件,它有一个简单的注册表,但是父模板上的submit按钮。因此,当我按下submit按钮时,它将从子组件表单中获取数据

这是我的例子

父组件ts

import {Component, ViewChild, OnDestroy, Output, EventEmitter} from '@angular/core';
import {GlobalEvent} from 'app/shared/GlobalEvent';


@Component({
    selector: 'signup',
    templateUrl: 'SignUpModalComponent.html',
    styleUrls: ['SignUpModalComponent.scss'],
})

export class SignUpModalComponent implements OnDestroy {
    public overlayState: boolean;
    public step: number = 1;
    public formSubmit: boolean;

    @ViewChild('firstModal')
    modal: any;

    constructor(private modalEventService: GlobalEvent) {
        this.modalEventService.modalChangeEvent.subscribe((res: boolean) => {
            this.overlayState = res;
            if (res) {
                this.modal.open();
            } else {
                this.modal.close();
            }
        });
    }

    closeModal(value: boolean): void {
        this.modalEventService.close(false);
        this.modal.close()
    }

    ngOnDestroy() {
        this.modalEventService.modalChangeEvent.unsubscribe();
    }

    incrementStep():void {
        this.step += 1;
    }

    decrementStep():void {
        this.step -= 1;
    }

    onFormSubmit(): void {
        this.formSubmit = true;
    }
}
父组件html模板

<div class="modal-overlay" *ngIf="overlayState"></div>
<modal (onClose)="closeModal(false)" #firstModal >
    <modal-header>
        <button (click)="firstModal.close()" class="close-btn"><i class="material-icons">close</i></button>
        <div class="steps-container">
            <span [ngClass]="{'active': step == 1 }">1</span>
            <span [ngClass]="{'active': step == 2 }">2</span>
            <span [ngClass]="{'active': step == 3 }">3</span>
            <span [ngClass]="{'active': step == 4 }">4</span>
        </div>
    </modal-header>
    <modal-content>
        <signup-form [hidden]="step != 1" [formSubmit]="formSubmit"></signup-form>
        <signup-social ngClass="social-step{{step}}" [step]="step"></signup-social>
    </modal-content>
    <modal-footer>
        <button md-button (click)="decrementStep()" [hidden]="step == 1"><Back</button>

        <button md-button (click)="incrementStep(); onFormSubmit()"  [hidden]="step != 1">Next></button>

        <button md-button (click)="incrementStep()"  [hidden]="step == 1 || step == 4">Skip</button>
    </modal-footer>
</modal>
<div class="sign-up-form clearfix">
    <form novalidate (ngSubmit)="onSubmit(signupInfo)" [formGroup]="signupInfo">
        <label>
            <input type="file" placeholder="Last Name*" name="lastName"/>
            upload an avatar
        </label>

        <md-input-container>
            <input md-input placeholder="Email address*" name="email" formControlName="email"/>
        </md-input-container>
        <!--<p *ngIf="signupInfo.controls.email.errors?.email">error message</p>-->
        <div class="errror-msg" *ngIf="signupInfo.controls.email.errors?.email">
            <md-hint>
                <span>Name should be minimum 6 characters</span>
            </md-hint>
        </div>
        <p *ngIf="signupInfo.controls.username.errors?.min">error message</p>
        <div class="input-wrap" [ngClass]="{'error': signupInfo.controls.username.errors?.min}">
            <md-input-container>
                <input md-input placeholder="Username*" name="username" formControlName="username"/>
            </md-input-container>
            <div class="errror-msg" *ngIf="signupInfo.controls.username.errors?.min">
                <md-hint>
                    <span>Name should be minimum 6 characters</span>
                </md-hint>
            </div>

            <div class="errror-msg"
                 *ngIf="signupInfo.get('username').hasError('minlength') && signupInfo.get('username').touched">
                <md-hint>
                    <span>Name should be minimum 6 characters</span>
                </md-hint>
            </div>
        </div>
        <p *ngIf="signupInfo.controls.password.errors?.rangeLength">error xcdfdfd</p>
        <md-input-container>
            <input md-input placeholder="Password*" formControlName="password"/>
        </md-input-container>

        <p *ngIf="signupInfo.controls.confirmPassword.errors?.rangeLength">error password</p>
        <p *ngIf="signupInfo.controls.confirmPassword.errors?.equal">error equal</p>

        <md-input-container>
            <input md-input placeholder="Confirm Password*" formControlName="confirmPassword"/>
        </md-input-container>

        <p *ngIf="signupInfo.controls.fullName.errors?.min">error password</p>
        <md-input-container>
            <input md-input placeholder="Full Name*" name="fullName" formControlName="fullName"/>
        </md-input-container>

        <p *ngIf="signupInfo.controls.gender.errors?.required">error password</p>
        <md-select placeholder="Gender" formControlName="gender">
            <md-option *ngFor="let food of ['react','angular']" [value]="food">
                {{ food }}
            </md-option>
        </md-select>
        <p *ngIf="signupInfo.controls.countrys.errors?.required">error password</p>
        <md-select placeholder="Country" formControlName="countrys">
            <md-option *ngFor="let country of countrys" [value]="country">
                {{ country.name }}
            </md-option>
        </md-select>
        <div class="input-wrap">
            <md-input-container placeholder="Date of Birth *">
                <input md-input placeholder="mm/dd/yyyy" type="text" name="DateofBirth"/>
            </md-input-container>
        </div>
    </form>
</div>

关闭
1.
2.
3.
4.
跳过
子组件ts文件

import {Component, OnInit, Input} from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
import {CustomValidators} from 'ng2-validation';


import {SignUpFormInterface} from './SignUpFormInterface';

@Component({
    selector: 'signup-form',
    templateUrl: 'SignUpForm.html',
    styleUrls: ['SignUpForm.scss']
})


export class SignUpForm implements OnInit {
    signupInfo: FormGroup;
    public tmppass: any;

    @Input() set formSubmit(sendData: boolean) {
        if (sendData) {

        }
    }

    constructor(private formbuilder: FormBuilder) {
    }

    ngOnInit() {

        this.signupInfo = this.formbuilder.group({
            email: ['', [CustomValidators.email]],
            username: ['', [Validators.required, CustomValidators.min(10)]],
            password: ['', [Validators.required, CustomValidators.rangeLength([5, 100]), this.setPass]],
            confirmPassword: ['', [Validators.required, CustomValidators.rangeLength([5, 100]), CustomValidators.equal(this.tmppass)]],
            fullName: ['', [Validators.required, CustomValidators.min(10)]],
            gender: ['', [Validators.required]],
            countrys: ['', [Validators.required]],
        });
    }

    setPass(c: any): void {
        console.log('sdsd', c.value);
        if (c.value) {
            this.tmppass = '';
            this.tmppass = <string>c.value;
        }
    }


    onSubmit({value, valid}: {value: SignUpFormInterface, valid: boolean}) {
        console.log(this.signupInfo);
    }

    cons() {
        console.log(this.signupInfo);
    }
}

function validateEmail(c: any) {
    let EMAIL_REGEXP = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
    return EMAIL_REGEXP.test(c.value) ? c.email = false : c.email = true;

}
从'@angular/core'导入{Component,OnInit,Input};
从“@angular/forms”导入{FormBuilder、FormGroup、Validators};
从“ng2验证”导入{CustomValidators};
从“./SignUpFormInterface”导入{SignUpFormInterface};
@组成部分({
选择器:'注册表格',
templateUrl:'SignUpForm.html',
样式URL:['SignUpForm.scss']
})
导出类注册表单实现OnInit{
注册信息:FormGroup;
公共TMPPAS:任何;
@Input()设置formSubmit(sendData:boolean){
if(发送数据){
}
}
构造函数(专用formbuilder:formbuilder){
}
恩戈尼尼特(){
this.signupInfo=this.formbuilder.group({
电子邮件:[''[CustomValidators.email]],
用户名:['',[Validators.required,CustomValidators.min(10)],
密码:['',[Validators.required,CustomValidators.rangeLength([5100]),this.setPass]],
confirmPassword:[''[Validators.required,CustomValidators.rangeLength([5100]),CustomValidators.equal(this.tmppass)],
全名:[''[Validators.required,CustomValidators.min(10)],
性别:[''[Validators.required]],
国家:[''[Validators.required]],
});
}
setPass(c:任何):无效{
console.log('sdsd',c.value);
如果(c.值){
this.tmppass='';
该值为c.tmppass=c.value;
}
}
onSubmit({value,valid}:{value:SignUpFormInterface,valid:boolean}){
console.log(this.signupInfo);
}
反对意见(){
console.log(this.signupInfo);
}
}
函数validateEmail(c:任意){
让我们通过电子邮件发送[A-Z0-9.[U%+-]+@[A-Z0-9.-]+\[A-Z]{2,4}$/i;
返回电子邮件\u REGEXP.test(c.value)?c.EMAIL=false:c.EMAIL=true;
}
子组件html模板

<div class="modal-overlay" *ngIf="overlayState"></div>
<modal (onClose)="closeModal(false)" #firstModal >
    <modal-header>
        <button (click)="firstModal.close()" class="close-btn"><i class="material-icons">close</i></button>
        <div class="steps-container">
            <span [ngClass]="{'active': step == 1 }">1</span>
            <span [ngClass]="{'active': step == 2 }">2</span>
            <span [ngClass]="{'active': step == 3 }">3</span>
            <span [ngClass]="{'active': step == 4 }">4</span>
        </div>
    </modal-header>
    <modal-content>
        <signup-form [hidden]="step != 1" [formSubmit]="formSubmit"></signup-form>
        <signup-social ngClass="social-step{{step}}" [step]="step"></signup-social>
    </modal-content>
    <modal-footer>
        <button md-button (click)="decrementStep()" [hidden]="step == 1"><Back</button>

        <button md-button (click)="incrementStep(); onFormSubmit()"  [hidden]="step != 1">Next></button>

        <button md-button (click)="incrementStep()"  [hidden]="step == 1 || step == 4">Skip</button>
    </modal-footer>
</modal>
<div class="sign-up-form clearfix">
    <form novalidate (ngSubmit)="onSubmit(signupInfo)" [formGroup]="signupInfo">
        <label>
            <input type="file" placeholder="Last Name*" name="lastName"/>
            upload an avatar
        </label>

        <md-input-container>
            <input md-input placeholder="Email address*" name="email" formControlName="email"/>
        </md-input-container>
        <!--<p *ngIf="signupInfo.controls.email.errors?.email">error message</p>-->
        <div class="errror-msg" *ngIf="signupInfo.controls.email.errors?.email">
            <md-hint>
                <span>Name should be minimum 6 characters</span>
            </md-hint>
        </div>
        <p *ngIf="signupInfo.controls.username.errors?.min">error message</p>
        <div class="input-wrap" [ngClass]="{'error': signupInfo.controls.username.errors?.min}">
            <md-input-container>
                <input md-input placeholder="Username*" name="username" formControlName="username"/>
            </md-input-container>
            <div class="errror-msg" *ngIf="signupInfo.controls.username.errors?.min">
                <md-hint>
                    <span>Name should be minimum 6 characters</span>
                </md-hint>
            </div>

            <div class="errror-msg"
                 *ngIf="signupInfo.get('username').hasError('minlength') && signupInfo.get('username').touched">
                <md-hint>
                    <span>Name should be minimum 6 characters</span>
                </md-hint>
            </div>
        </div>
        <p *ngIf="signupInfo.controls.password.errors?.rangeLength">error xcdfdfd</p>
        <md-input-container>
            <input md-input placeholder="Password*" formControlName="password"/>
        </md-input-container>

        <p *ngIf="signupInfo.controls.confirmPassword.errors?.rangeLength">error password</p>
        <p *ngIf="signupInfo.controls.confirmPassword.errors?.equal">error equal</p>

        <md-input-container>
            <input md-input placeholder="Confirm Password*" formControlName="confirmPassword"/>
        </md-input-container>

        <p *ngIf="signupInfo.controls.fullName.errors?.min">error password</p>
        <md-input-container>
            <input md-input placeholder="Full Name*" name="fullName" formControlName="fullName"/>
        </md-input-container>

        <p *ngIf="signupInfo.controls.gender.errors?.required">error password</p>
        <md-select placeholder="Gender" formControlName="gender">
            <md-option *ngFor="let food of ['react','angular']" [value]="food">
                {{ food }}
            </md-option>
        </md-select>
        <p *ngIf="signupInfo.controls.countrys.errors?.required">error password</p>
        <md-select placeholder="Country" formControlName="countrys">
            <md-option *ngFor="let country of countrys" [value]="country">
                {{ country.name }}
            </md-option>
        </md-select>
        <div class="input-wrap">
            <md-input-container placeholder="Date of Birth *">
                <input md-input placeholder="mm/dd/yyyy" type="text" name="DateofBirth"/>
            </md-input-container>
        </div>
    </form>
</div>

上传化身
名称至少应包含6个字符
错误消息

名称至少应包含6个字符 名称至少应包含6个字符 错误XCDFD

密码错误

错误相等

密码错误

错误密码

{{食物} 错误密码

{{country.name}

谢谢您的帮助:)

这会对您有所帮助,所以当我使用@viewChild时,它会返回我的表单html@RobinDijkhof好的,我知道了,谢谢