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

Sum*_*wal 43 angular2-components angular

我有一个实现,其中父级希望通过使用@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() { }

}
Run Code Online (Sandbox Code Playgroud)

Ara*_*ind 80

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

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() { }

}
Run Code Online (Sandbox Code Playgroud)

使用子组件的父组件将为

@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'
  }
}
Run Code Online (Sandbox Code Playgroud)

现场演示

  • 这应该是答案.也适用于默认值`@Input()showName?:boolean = true;` (8认同)
  • 我想知道,与常规`@Input()showName有什么不同:boolean;`?然后检查是否为空?我的意思是 - 有什么区别? (3认同)

Gün*_*uer 24

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

您可以实现OnChanges或使输入时的值实际传递让你的代码执行的二传手,而不是一个属性.

export class child {

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

    constructor() { }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么你认为它更好?当父进程必须向服务器发出请求并且只将值传递给子进程时,这可能是在调用`ngAfterViewInit()`之后的一段时间.`ngAfterViewInit()`可能适用于你的具体案例,但总的来说我不推荐它. (6认同)