角度2:组件交互,可选输入参数

问题描述 投票:34回答:3

我有一个实现,其中父级希望通过使用子组件中可用的@Input参数将某些数据传递给子组件。但是,此数据传输是可选的,父母可能会或可能不会根据要求传递它。是否可以在组件中包含可选的输入参数。我在下面描述了一个场景:

 <parent>
    <child [showName]="true"></child> //passing parameter
    <child></child> //not willing to passing any parameter
</parent>



//child component definition
@Component {
    selector:'app-child',
    template:`<h1>Hi Children!</h1>
          <span *ngIf="showName">Alex!</span>`
}


export class child {

    @Input showName: boolean;

    constructor() { }

}
angular angular2-components
3个回答
74
投票

您可以使用(?)运算符,如下所示

import {Component,Input} from '@angular/core';
@Component({
    selector:'child',
    template:`<h1>Hi Children!</h1>
          <span *ngIf="showName">Alex!</span>`
})


export class ChildComponent {

    @Input() showName?: boolean;

    constructor() { }

}

使用子组件的父组件将为

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello {{name}}</h2>
      <child [showName]="true"></child>
      <child ></child>
    </div>
  `,
})
export class App {
  name:string;
  constructor() {
    this.name = 'Angular2'
  }
}

LIVE DEMO


23
投票

默认情况下,输入值是可选的。您的代码只有在尝试访问未实际传递的输入属性时才会失败(因为这些输入是undefined)。

您可以实现OnChanges或使输入成为setter而不是属性,以便在实际传递值时执行代码。

export class child {

    @Input set showName(value: boolean) {
      this._showName = value;
      doSomethingWhenShowNameIsPassed(value);
    }

    constructor() { }
}

1
投票

你有两个选择。

1)你可以在孩子身上使用*ngIf,以防孩子在输入为空时不需要显示。

 <parent>
    <child *ngIf="true" [showName]="true"></child> //passing parameter
    <child></child> //not willing to passing any parameter
</parent>

2)如果孩子应该在没有任何输入的情况下显示,你可以使用修改后的setter来检查是否存在输入变量

在child.ts中:

private _optionalObject: any;
@Input()
set optionalObject(optionalObject: any) {
    if(optionalObject) this._optionalObject = optionalObject;
}
get optionalObject() { return this._optionalObject; }
© www.soinside.com 2019 - 2024. All rights reserved.