【问题标题】:Angular 2 child component can't get parent componentAngular 2子组件无法获取父组件
【发布时间】:2016-07-15 12:17:33
【问题描述】:

我正在尝试make a component,它将显示给定控制输入名称的特定错误消息。 这是我的代码...

register.ts:

import { Component } from 'angular2/core';
import { FormBuilder, Validators } from 'angular2/common';
import {ControlMessages} from './control-msg';
@Component({
    selector: 'registration-form',
    templateUrl: './app/components/registration/registration.html',
    directives: [ControlMessages]
})

控制-msg.ts:

import {Component, Host} from 'angular2/core';
import {NgFormModel,FORM_PROVIDERS} from 'angular2/common';
@Component({
    selector: 'control-messages',
    inputs: ['controlName: control'],
    template: `<div *ngIf="errorMessage !== null">{{errorMessage}}</div>`
})
export class ControlMessages {
    controlName: string;
    constructor( @Host() private _formDir: NgFormModel){/* _formDir doesn't get the parent object! */}

    get errorMessage() {
        // Find the control in the Host (Parent) form
        let c = this._formDir.form.find(this.controlName);
        return null;
    }
}

问题是您可以看到ControlMessages 无法获得我父母NgFormModel 的值。

Angular 2 向我显示了这个错误,

例外:没有 NgFormModel 的提供者! (ControlMessages -> NgFormModel)

如果我在 ControlMessages 中包含 NgFormModel 作为提供程序,它会显示此错误,

异常:TypeError:无法在 [errorMessage !== null in ControlMessages@0:5] 中读取属性 'find'

请注意,在引导应用程序时我没有注入任何提供程序。
我正在使用 angular2 beta 12

编辑:

表单模板:

<div class="form-group" 
     [class.has-error]="!registerForm.find('username').valid && registerForm.find('username').dirty">
  <label for="username">Username</label>
  <input type=text id="username" class="form-control" placeholder="username" 
         [ngFormControl]="registerForm.find('username')">
  <control-messages control="username"></control-messages>
</div>

【问题讨论】:

  • 您是否将FORM_PROVIDERS 注入到引导函数中?
  • 能否添加更多代码(RegistrationForm 类,模板)
  • ControlMessages 组件嵌套在一个 div 中。这就是它没有得到父对象的原因。

标签: angular angular2-directives angular2-forms angular2-formbuilder


【解决方案1】:

ControlMessages 组件嵌套在一个 div 中。这就是为什么它没有得到父对象。

表单模板应该是这样的:

<form [ngFormModel]="registerForm" (ngSubmit)="onSubmit()">

  <div class="form-group" 
       [class.has-error]="!registerForm.find('username').valid && registerForm.find('username').dirty">
    <label for="username">Username</label>
    <input type=text id="username" class="form-control" placeholder="username" 
           [ngFormControl]="registerForm.find('username')">
  </div>

  <control-messages control="username"></control-messages>

  <button type="submit" class="btn btn-primary"
          [disabled]="!registerForm.find('username').valid">Register</button>

</form>

【讨论】:

  • 嗨@anon。在继续创建新问题之前,我想我会先在这里尝试:* q1:你在哪里提供NgFormModel?在引导程序中,还是在ControlMessages 中,或者两者兼而有之? * 问题 2:当组件嵌套在
    中时,您知道如何获取具有非空 .form 的 NgFormModel 的 有效 实例吗?
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多