Angular(5):可重用表单组件的双向数据绑定?

时间:2018-05-03 17:10:44

标签: javascript angular

在Angular(5)中,我正在尝试为模板驱动的表单编写一组可重用的表单控件。它需要能够从父组件中获取模型并将其传递给元素以进行双向数据绑定。

这就是我所拥有的。

admin-panel.component.ts(父窗体)

import { Component, OnInit } from '@angular/core';
import{ NgForm } from '@angular/forms';

@Component({
  selector: 'admin-panel',
  template: `
    <label>Settings</label>
    <!-- the below doesn't work, but is an example of how I'd like to use it -->
    <settings name="settings" [(ngModel)]="preset.settings"></settings>
`
})
export class AdminPanelComponent implements OnInit 
{
    preset;

    ngOnInit()
    {
        this.preset = {
            name: '',
            settings: {
                settingOne: 'foo',
                settingTwo: false,
                settingThree: 14
            }
    }
}

settings.component.html

对于下面的ngModel,我还尝试将其设置为model.settingOnemodel.settingTwo,但这也不起作用。

<div [ngModelGroup]="group">
    <select name="settingOne" [(ngModel)]="model.settingOne">
      <option value="foo">Foo</option>
      <option value="bar">Bar</option>
    </select>
    <input type="checkbox" name="settingTwo" [(ngModel)]="model.settingTwo">
</div>

settings.component.ts

import { Component, Input } from '@angular/core';
import { ControlContainer, NgForm } from '@angular/forms';

@Component({
  selector: 'settings',
  templateUrl: './settings.component.html',
  viewProviders:[{provide: ControlContainer, useExisting: NgForm}]
})
export class SettingsComponent
{
  @Input('name') group: string;
  //@Input('model') model;
}

2 个答案:

答案 0 :(得分:0)

啊,傻傻的错误。上面的代码确实适用于一些小的改动。

首先,在 admin-panel.component.ts 中,替换

<settings name="settings" [(ngModel)]="preset.settings"></settings>

<settings name="settings" [(model)]="preset.settings"></settings>

匹配 settings.component.ts 中的输入变量是在正确的轨道上。

但是,它似乎不起作用,因为我的形式是

[ngFormOptions]="{ updateOn: 'submit' }",所以没有任何内容得到更新。删除它允许更新通过。

答案 1 :(得分:0)

如果在任何组件上实现“ ControlValueAccessor”,那么我们可以为您的自定义组件自动进行双向数据绑定。

实施here