gpt4 book ai didi

angular - 如何在 contenteditable 元素中使用 ngControl?

转载 作者:太空狗 更新时间:2023-10-29 18:26:59 26 4
gpt4 key购买 nike

如何使用 ngControlcontenteditable元素?例如,我想要:

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

通过绑定(bind)(?)将其绑定(bind)到模型驱动的“表单”(表格)。我用 formBuilder 创建了他基于架构,从服务器检索。
目前我认为这不起作用,因为<td> (和其他)元素没有属性 value .然后,可以重载一些方法来使用 textContent属性(property)?或者存在其他方式来做到这一点?

谢谢。

最佳答案

为了能够将 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 兼容自定义组件的更多详细信息,您可以在“NgModel 兼容组件”部分查看这篇文章:

关于angular - 如何在 contenteditable 元素中使用 ngControl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36122136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com