角度 2 中组件中的表行

War*_*ens 5 angular2-template angular

我想在 Angular 2 中制作一个 TableRowsComponent 来呈现多个表行。

我想在这样的模板中使用它:

<table class>
    <tbody>
        <table-rows *ngFor="#item of list" [someInput]="item"></table-rows>
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

(因此“table-rows”将是此处 TableRowsComponent 的选择器)TableRowsComponent 的模板将类似于:

<tr>
    <td> foo </td> 
    <td> bar </td>
</tr>
<tr *ngIf="something">
    ....
</tr>
<tr *ngFor="..">
     ...
</tr>
Run Code Online (Sandbox Code Playgroud)

如果我们这样做,那么结果如下所示:

<table class>
        <tbody>
            <table-rows>
                <tr>
                    ...
                </tr> 
                <tr>
                    ...
                </tr> 
            </table-rows>
            <table-rows>
                <tr>
                    ...
                </tr> 
                <tr>
                    ...
                </tr> 
            </table-rows> 
        </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

不幸的是, < table-rows > 元素搞乱了表格的渲染。如何解决这个问题呢?有没有办法让 angular2 不渲染 < table-rows > 元素?

小智 0

import { Component, Input, OnChanges } from '@angular/core';
import { FormGroup, FormBuilder, NgForm, REACTIVE_FORM_DIRECTIVES, Validators } from '@angular/forms';

    @Component({
      selector: '[dependent-row]',
      providers: [],
      template: `
        <tr [formGroup]="dependentForm">
          <td>
            <input type="text" formControlName="foo">
          </td>
          <td>
            <input type="text" formControlName="bar">
          </td>
        </tr>
      `,
      directives: [REACTIVE_FORM_DIRECTIVES]
    })
    export class DependentRowComponent implements OnChanges {
      @Input() dependent: any;
      _Form: any;

      constructor(fb: FormBuilder) {
        this.dependentForm = fb.group({
          foo: [''],
          bar: [''],
        })
      }

      ngOnChanges() {
        this._Form.find('foo').updateValue(this.dependent.foo);
        this._Form.find('bar').updateValue(this.dependent.bar);
      }
    }
Run Code Online (Sandbox Code Playgroud)