如何在contenteditable元素中使用ngControl?

时间:2016-03-21 02:17:56

标签: angular angular2-template angular2-forms

如何在ngControl元素中使用contenteditable? 例如,我想:

<!-- *ngFor over rows and columns in table -->
<td contenteditable="true" [ngControl]="row.number + column.number"></td>

将(?)绑定到模型驱动的&#34;形式&#34; (表)。我使用基于模式的formBuilder创建了他,从服务器检索 目前我认为这不起作用,导致<td>(以及其他)元素避免属性value。那么,是否可能重载某些方法以使用textContent属性?还是存在其他方式来做到这一点?

谢谢。

1 个答案:

答案 0 :(得分:3)

为了能够将contenteditable元素与Angular2和控件一起使用,您需要创建一个适用于contenteditable的自定义指令。该指令必须与ngModel / ngForm兼容,这样您才能使用ngFormngFormControl等指令。在内部,该指令将注册一个自定义的“值

这是一个可能的实现:

const CUSTOM_VALUE_ACCESSOR = CONST_EXPR(new Provider(
  NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => ContenteditableAccessor), multi: true}));

@Directive({
  selector: '[contenteditable]',
  host: {'(blur)': 'onBlur($event)'},
  providers: [CUSTOM_VALUE_ACCESSOR]
})
export class ContenteditableAccessor implements ControlValueAccessor {
  onChange = (_) => {};
  onTouched = () => {};

  constructor(private eltRef:ElementRef) {
  }

  ngOnInit() {
    this.onChange(this.eltRef.nativeElement.innerText);
  }

  writeValue(value: any): void {
    if (value!=null) {
      this.eltRef.nativeElement.innerText = value;
    }
  }

  onBlur(event) {
    this.onChange(this.eltRef.nativeElement.innerText);
  }

  registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
  registerOnTouched(fn: () => void): void { this.onTouched = fn; }
}

您将能够在组件中以这种方式使用此指令:

@Component({
  selector: 'my-app',
  template: `
    <div>
      <form>
        <label>First name:</label>
        <span contenteditable="true" [ngFormControl]="testCtrl">Some value</span>
      </form>
      <div>
        firstName: {{testCtrl.value}}<br/>
        firstName: {{testCtrl.valid}}<br/>
      </div>
      <div (click)="updateConditions()">Update conditions</div>
    </div>
  `,
  directives: [ FORM_DIRECTIVES, ContenteditableAccessor ]
})
export class AppComponent {
  constructor() {
    this.testCtrl = new Control();
  }
}

这是相应的plunkr:https://plnkr.co/edit/JbjXIa?p=preview

有关符合ngForm / ngModel的自定义组件的更多详细信息,您可以在&#34;与NgModel兼容的组件&#34;

一节中查看本文。