【问题标题】:How to combine NgForm and [(ngModel)] with MaterialSelectComponent and MaterialDropdownSelectComponent?如何将 NgForm 和 [(ngModel)] 与 MaterialSelectComponent 和 MaterialDropdownSelectComponent 结合起来?
【发布时间】:2019-12-27 06:38:12
【问题描述】:

我知道这个问题类似于12,但让我用详细的示例代码解释一下。

我使用组件material-selectmaterial-dropdown-select 组合来自angular_components material_select_example 34 的代码。 (为了清楚起见,我把完整的代码放在底部)

我想用 NgForm 处理表单结果, 比如现在我使用一个方法logConsole(NgForm form)

我对材料选择的尝试,

<material-select focusList [selection]="targetLanguageSelection"
                 [(ngModel)]="selectionValue" #langVal="ngForm" (ngControl)="langVal"
                 class="bordered-list">

logConsole() 打印空地图 (Map(0))。我仍然可以从targetLanguageSelection.selectedValues 获取值。

从上面的代码中,如果我设置ngControl="langVal",我得到一个异常:

No value accessor for (langVal) or you may be missing formDirectives in your directives list.

然后我改为material-dropdown-select,我不能使用ngControl,因为buttonText不会显示选择的值。

<material-dropdown-select
        [buttonText]="selectionValue == null ? 'Select Language' : selectionValue.uiDisplayName"
        [(ngModel)]="selectionValue" #langVal="ngForm"
        [options]="languageListOptions"  displayNameRenderer>

但它仍然失败,logConsole() 仍然打印空地图 (Map(0))。我仍然可以从selectionValue 获取值。

那么如何用 NgForm 获取值呢?

编辑: 我仍在研究如何从MaterialSelectComponent 获得NgForm 值, 我已经可以通过MaterialDropdownSelectComponentngControl 而不是(ngControl) 获得NgForm 值,如下所示:

<material-dropdown-select
        [buttonText]="selectionValue == null ? 'Select Language' : selectionValue.uiDisplayName"
        [(ngModel)]="selectionValue" #langVal="ngForm" ngControl="langVal"
        [options]="languageListOptions"  displayNameRenderer>
</material-dropdown-select>

--

这里是 material_select_demo_component.dart

@Component(
  selector: 'material-select-demo',
  providers: popupBindings,
  directives: [
    materialInputDirectives,
    formDirectives,
    displayNameRendererDirective,
    FocusListDirective,
    FocusItemDirective,
    MaterialSelectComponent,
    MaterialSelectItemComponent,
    MaterialButtonComponent,
    MaterialDropdownSelectComponent,
    DropdownSelectValueAccessor,
    NgFor,
  ],
  templateUrl: 'material_select_demo_component.html',
  styleUrls: ['material_select_demo_component.css'],
)
class MaterialSelectDemoComponent {
  final SelectionModel<Language> targetLanguageSelection =
      SelectionModel.single();

  Language selectionValue;

  ExampleSelectionOptions languageListOptions =
      ExampleSelectionOptions(_languagesList);

  List<Language> get languagesList => _languagesList;

  void logConsole(NgForm form) {
    html.window.console.log(form.value);
    html.window.console.log(selectionValue);
    html.window.console
        .log(targetLanguageSelection.selectedValues.toList().toString());
  }

  static const List<Language> _languagesList = <Language>[
    Language('en-US', 'US English'),
    Language('en-UK', 'UK English'),
    Language('fr-CA', 'Canadian English'),
    Language('zh-CN', 'Chichewa'),
    Language('zh-TW', 'Chinese'),
    Language('ny', 'Chinese (Simplified)'),
    Language('zh', 'Chinese (Traditional)'),
  ];
}

class Language implements HasUIDisplayName {
  final String code;
  final String label;
  const Language(this.code, this.label);
  String toString() => '${label} (${code})';
  @override
  String get uiDisplayName => label;
}

class ExampleSelectionOptions extends StringSelectionOptions<Language>
    implements Selectable<Language> {
  ExampleSelectionOptions(List<Language> options)
      : super(options,
            toFilterableString: (Language option) => option.toString());
  ExampleSelectionOptions.withOptionGroups(List<OptionGroup> optionGroups)
      : super.withOptionGroups(optionGroups,
            toFilterableString: (Language option) => option.toString());
  @override
  SelectableOption getSelectable(Language item) =>
      item is Language && item.code.contains('en')
          ? SelectableOption.Disabled
          : SelectableOption.Selectable;
}

这是 material_select_demo_component.html

<form #languageForm="ngForm">
<section>
    <material-select focusList [selection]="targetLanguageSelection" class="bordered-list">
        <material-select-item *ngFor="let language of languagesList"
                              focusItem [value]="language"
                              displayNameRenderer>
        </material-select-item>
    </material-select>
</section>
<section>
    <material-dropdown-select
            [buttonText]="selectionValue == null ? 'Select Language' : selectionValue.uiDisplayName"
            [options]="languageListOptions" [(ngModel)]="selectionValue" displayNameRenderer>
    </material-dropdown-select>
</section>
    <material-button raised (click)="logConsole(languageForm)">submit</material-button>
</form>

pubspec.yaml 文件

environment:
  sdk: '>=2.4.0 <3.0.0'

dependencies:
  angular: ^6.0.0-alpha
  angular_components: ^0.14.0-alpha
  angular_forms: ^2.1.3

谢谢。

【问题讨论】:

    标签: dart angular-components angular-dart angular-forms


    【解决方案1】:

    我建议从非常简单的开始并使用 FormBuilder:

    class Language {
      final String code;
      final String label;
      const Language(this.code, this.label);
    
      @override
      String toString() => label;
    }
    

    在您的组件中:

    StringSelectionOptions<Language> languageOptions = StringSelectionOptions<Language>(_languagesList);
    Language selectedLanguage;
    
    ControlGroup myForm;
    
    void ngOnInit() {
        myForm = FormBuilder.controlGroup({
          'language': FormBuilder.controlGroup([selectedLanguage]);
        });
    }
    
    void onSubmit() {
       print(myForm.value);
       print(selectedLanguage);
    }
    
    <form [ngFormModel]="myForm" (ngSubmit)="onSubmit()">
        <material-dropdown-select
                buttonText="{{selectedLanguage??'Choose ...'}}"
                [(ngModel)]="selectedLanguage"
                ngControl="language"
                [options]="languageOptions">
        </material-dropdown-select>
        <material-button
                [disabled]="!myForm.valid"
                (trigger)="onSubmit()">Submit</material-button>
    </form>
    

    【讨论】:

    • 谢谢,先试试。实际上,我正在寻找有关 FormBuilder 的更多信息,因为有人提到了 angular dart 中的反应形式,但我仍然无法获得完整的示例或文章。这就是为什么我使用角镖材料组件的代码。您对 FormBuilder(可能还有反应形式)有很好的参考吗?
    • 这是我读到的上一个 SO,你也在那里回答,stackoverflow.com/questions/54971760/…
    • 对不起,我没有具体的例子。我是通过查看 doc 和 angular_components 示例自学的。
    猜你喜欢
    • 2021-04-17
    • 2012-07-16
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多