typescript - Angular2 formulärfält växlar inte på @input-variabel


I Angular2 har jag ett mycket enkelt formulär:

Form.ts

import {Component, Input} from 'angular2/core'

@Component({
  selector: 'my-form',
  providers: [],
  template: `
    <form>

      {{ details }}

      <input type="text" placeholder="name" />
      <input *ngIf="details" type="text" placeholder="details" />
    </form>
  `,
  directives: []
})
export class MyForm {

  @Input() details: bool;

  constructor() {

  }
}

Som visas i denna Plunkr, när jag växlar details @input via knappen, ändras texten mellan true och false.

Men *ngIf växlar inte textfältet alls.

Några tankar om vad jag missar här?

App.ts

import {Component} from 'angular2/core'
import {MyForm} from './form'

@Component({
  selector: 'my-app',
  providers: [],
  template: `
    <div>
      <button (click)="toggle()">toggle details</button>
      <my-form details="{{visible}}"></my-form>
    </div>
  `,
  directives: [MyForm]
})
export class App {

  visible: boolean = false;

  constructor() {
    this.name = 'Angular2'
  }

  toggle() {
    this.visible = !this.visible;
  }
}

Svar #1

Du bör använda följande istället:

<my-form [details]="visible"></my-form>

istället för

<my-form details="{{visible}}"></my-form>

Detta gör det möjligt att använda egenskapsbindning, dvs. enkelriktad bindning (via referens). Detta innebär att när det angivna uttrycket ändras kan underkomponenten se uppdateringen.

I ditt fall initialiserar du helt enkelt ingången till underkomponenten med värdet av uttrycket visible med hjälp av interpolation. Men då kommer inte din underkomponent att se uppdateringar.

Dessutom, i ditt fall, tillhandahåller du en sträng och inte en boolean. Endast egenskapsbindning tillåter att tillhandahålla typer som är olika sträng...

Se den fungerande plunkr: https://plnkr.co/edit/z7rKGb6mLdLNj2jtSlcU?p=preview.

Svar #2

Använd istället

<my-form [details]="visible"></my-form>

Plunker

<my-form details="{{visible}}"></my-form>

passerar 'true' till visible (omvandlar till sträng). Med [details] skickas det omodifierade värdet. Därför måste detta formulär användas om du vill skicka något annat än en string.