Angular dart - 使用 ngModel 的自定义输入组件
Angular dart - custom input component with ngModel
我正在尝试创建一个自定义输入文本组件,但我不知道如何让它与 ngModel
指令一起工作。
我试过复制 material angular_component input 但无法理解 inputText
属性 实际上是如何链接到 ngModel
值的以及目的是什么DefaultValueAccessor
指令。
这就是我希望如何使用我的组件:
<my-input-component [(ngModel)]="someProp"><my-input-component>
(其中 my-input-component
的内容只是带有标签的普通 <input type="text">
字段)
任何想法或指向 examples/docs 的链接将不胜感激。
调试angular_components代码后,我自己找到了答案。您必须实施 ControlValueAccessor
并注册 ngValueAccessor
提供商(这实际上是缺失的部分)。
这是我的解决方案:
// my_custom_component.dart
@Component(
selector: 'my-custom-component',
templateUrl: '<div class="input-wrapper">{{value}}</div>',
providers: [
ExistingProvider.forToken(ngValueAccessor, MyCustomComponent),
],
)
class MyCustomComponent implements ControlValueAccessor<String> {
String value;
// ...could define a setter that call `_changeController.add(value)`
final _changeController = StreamController<String>();
@Output()
Stream<String> get onChange => _changeController.stream;
@override
void writeValue(String newVal) {
value = newVal ?? '';
}
@override
void registerOnChange(callback) {
onChange.listen((value) => callback(value));
}
// optionally you can implement the rest interface methods
@override
void registerOnTouched(TouchFunction callback) {}
@override
void onDisabledChanged(bool state) {}
}
// app_component.dart
@Component(
selector: 'app-component',
templateUrl: '''
<my-custom-component [(ngModel)]="data"></my-custom-component>
''',
directives: [
NgModel,
MyCustomComponent,
],
)
class AppComponent {
String data;
}
注意:angular_component使用指令,但主要思想是相同的。
我正在尝试创建一个自定义输入文本组件,但我不知道如何让它与 ngModel
指令一起工作。
我试过复制 material angular_component input 但无法理解 inputText
属性 实际上是如何链接到 ngModel
值的以及目的是什么DefaultValueAccessor
指令。
这就是我希望如何使用我的组件:
<my-input-component [(ngModel)]="someProp"><my-input-component>
(其中 my-input-component
的内容只是带有标签的普通 <input type="text">
字段)
任何想法或指向 examples/docs 的链接将不胜感激。
调试angular_components代码后,我自己找到了答案。您必须实施 ControlValueAccessor
并注册 ngValueAccessor
提供商(这实际上是缺失的部分)。
这是我的解决方案:
// my_custom_component.dart
@Component(
selector: 'my-custom-component',
templateUrl: '<div class="input-wrapper">{{value}}</div>',
providers: [
ExistingProvider.forToken(ngValueAccessor, MyCustomComponent),
],
)
class MyCustomComponent implements ControlValueAccessor<String> {
String value;
// ...could define a setter that call `_changeController.add(value)`
final _changeController = StreamController<String>();
@Output()
Stream<String> get onChange => _changeController.stream;
@override
void writeValue(String newVal) {
value = newVal ?? '';
}
@override
void registerOnChange(callback) {
onChange.listen((value) => callback(value));
}
// optionally you can implement the rest interface methods
@override
void registerOnTouched(TouchFunction callback) {}
@override
void onDisabledChanged(bool state) {}
}
// app_component.dart
@Component(
selector: 'app-component',
templateUrl: '''
<my-custom-component [(ngModel)]="data"></my-custom-component>
''',
directives: [
NgModel,
MyCustomComponent,
],
)
class AppComponent {
String data;
}
注意:angular_component使用指令,但主要思想是相同的。