如何从另一个组件访问 [(ngModel)]?
How to access [(ngModel)] from another component?
我有一个包含 ngx-quill 组件的通用组件。我想调用其他几个组件来获取编辑器而不是输入字段。我成功地完成了这项工作。但是我正在使用 ngModels 进行双向数据绑定,不能在 Div 上使用。如何在我的公共组件中访问它们。
所以这是我的常用组件:
common_component.html
<quill-editor>
</quill-editor>
Common_component.ts:
import { Component } from '@angular/core';
import * as _ from 'underscore';
@Component({
selector: 'app-quill-editor',
templateUrl: './common_component.html'
})
export class CommanQuillComponent {
constructor(
) {}
}
这就是我所说的:
main_component.html
<div>
<app-quill-editor
id="float-input"
placeholder=" "
name="myRange"
step="1"
[(ngModel)]="myVar"
></app-quill-editor>
</div>
main_component.ts 除了变量声明什么都没有。
现在这里的问题是 ngModel 不能在 div 上使用(它会抛出错误),html 认为是 div 标签,然后在里面调用,我想要那个 ngModel on ,我不能手动放置它,因为它将用作通用组件。
请帮助我了解如何实现此数据绑定?
感谢您的支持,如果应该向 post 添加更易于理解的代码,请告诉我。
您正在寻找的是 ControlValueAccessor
实现自定义表单控件,以便 two-way 数据绑定可以在自定义组件上工作。
假设您在 quill-editor
:
上绑定了 value
变量
<quill-editor [ngModel]="value" (ngModelChange)="onChange($event)"></quill-editor>
@Component({
...
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CommanQuillComponent),
multi: true
}
]
})
export class CommanQuillComponent implements ControlValueAccessor() {
value: string = '';
...
// Add other properties as Input
@Input()
placeholder: string;
...
propagateChange = (_: any) => {};
registerOnChange(fn) {
this.propagateChange = fn;
}
writeValue(value: string) {
this.value = value; // <- you receive the value which is binded to this component here
}
onChange(event: string) {
this.value = event;
this.propagateChange(event); // <- you export the value so the binded variable is updated
}
}
现在您可以在 CommanQuillComponent
上使用 two-way 数据绑定:
<div>
<app-quill-editor
id="float-input"
placeholder=" "
name="myRange"
step="1"
[(ngModel)]="myVar"
></app-quill-editor>
</div>
网上有很多文章,您可以阅读以了解更多详细信息:
https://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html
https://javascript-conference.com/blog/angular-reactive-forms-building-custom-form-controls/
https://codinglatte.com/posts/angular/angular-build-custom-form-control/
我有一个包含 ngx-quill 组件的通用组件。我想调用其他几个组件来获取编辑器而不是输入字段。我成功地完成了这项工作。但是我正在使用 ngModels 进行双向数据绑定,不能在 Div 上使用。如何在我的公共组件中访问它们。
所以这是我的常用组件:
common_component.html
<quill-editor>
</quill-editor>
Common_component.ts:
import { Component } from '@angular/core';
import * as _ from 'underscore';
@Component({
selector: 'app-quill-editor',
templateUrl: './common_component.html'
})
export class CommanQuillComponent {
constructor(
) {}
}
这就是我所说的:
main_component.html
<div>
<app-quill-editor
id="float-input"
placeholder=" "
name="myRange"
step="1"
[(ngModel)]="myVar"
></app-quill-editor>
</div>
main_component.ts 除了变量声明什么都没有。
现在这里的问题是 ngModel 不能在 div 上使用(它会抛出错误),html 认为是 div 标签,然后在里面调用,我想要那个 ngModel on ,我不能手动放置它,因为它将用作通用组件。
请帮助我了解如何实现此数据绑定?
感谢您的支持,如果应该向 post 添加更易于理解的代码,请告诉我。
您正在寻找的是 ControlValueAccessor
实现自定义表单控件,以便 two-way 数据绑定可以在自定义组件上工作。
假设您在 quill-editor
:
value
变量
<quill-editor [ngModel]="value" (ngModelChange)="onChange($event)"></quill-editor>
@Component({
...
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CommanQuillComponent),
multi: true
}
]
})
export class CommanQuillComponent implements ControlValueAccessor() {
value: string = '';
...
// Add other properties as Input
@Input()
placeholder: string;
...
propagateChange = (_: any) => {};
registerOnChange(fn) {
this.propagateChange = fn;
}
writeValue(value: string) {
this.value = value; // <- you receive the value which is binded to this component here
}
onChange(event: string) {
this.value = event;
this.propagateChange(event); // <- you export the value so the binded variable is updated
}
}
现在您可以在 CommanQuillComponent
上使用 two-way 数据绑定:
<div>
<app-quill-editor
id="float-input"
placeholder=" "
name="myRange"
step="1"
[(ngModel)]="myVar"
></app-quill-editor>
</div>
网上有很多文章,您可以阅读以了解更多详细信息:
https://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html
https://javascript-conference.com/blog/angular-reactive-forms-building-custom-form-controls/
https://codinglatte.com/posts/angular/angular-build-custom-form-control/