【问题标题】:angular2 - ngModel not working on labels (ng2-bootstrap, paper-kit)angular2 - ngModel 不适用于标签(ng2-bootstrap,paper-kit)
【发布时间】:2016-09-27 17:57:36
【问题描述】:

对我来说,[(ngModel)]="foo" 不适用于用于重新设置默认 HTML5 表单控件样式的标签,更准确地说是单选按钮。目标是使用这些来更改值,例如使用默认输入无线电。我目前使用 ng2-bootstrap,但也尝试过 paper-kit (http://www.creative-tim.com/live/paper-kit)。

使用 ng2-bootstrap (https://valor-software.com/ng2-bootstrap/#/buttons) 的记录用法时

<label class="btn btn-primary" name="test" [(ngModel)]="foo" btnRadio="foo">foo</label>

我收到此错误:

core.umd.js:3468 Error: Uncaught (in promise): Error: No value accessor for form control with name: 'test'
at resolvePromise (zone.js:429)
at zone.js:465
at ZoneDelegate.invokeTask (zone.js:236)
at Object.onInvokeTask (core.umd.js:6233)
at ZoneDelegate.invokeTask (zone.js:235)
at Zone.runTask (zone.js:136)
at drainMicroTaskQueue (zone.js:368)
at XMLHttpRequest.ZoneTask.invoke (zone.js:308)

这可以使用标签中的ngDefaultControl 属性修复,但[(ngModel)] 仍会被忽略且不会传播。使用 paper-kit 也会出现同样的问题。

它适用于普通单选按钮,没有任何问题。

【问题讨论】:

标签: angular ng2-bootstrap angular2-ngmodel


【解决方案1】:

您需要将ButtonsModule添加到您要使用它们的模块的imports

@NgModule({
  imports: [ButtonsModule],
  declarations: [...],
  ...
})
export class MyModule {}

【讨论】:

  • 如果 systemjs 能找到它可能会解决问题,但我还是不明白,为什么 ngModel 不喜欢 Paper-Kit 中的其他标签,但这是另一个讨论
  • ngModel 要求在应用它的组件中实现ControlValueAccessor(或通过其他方式为匹配选择器提供)。如果组件没有正确导入,它们将不会在元素上实例化。如果它们没有被实例化,则没有ControlValueAccessor 因此ngModel 不能被应用。
  • 所以这意味着如果我想使用例如paper-kit 按钮,我需要实现一个自定义ControlValueAccessor?
  • 如果它们不是 Angular2 组件,你不能使用 ngModel 和它们。有时添加 ngDefaultControl 会有所帮助,但并非总是如此(不确切知道它的作用)。这并不意味着您根本不能将这些小部件与 Angular 一起使用,您只是不能使用 ngModel 来绑定值。您可以使用 Angular2 绑定来绑定到任何使用实际名称的属性、属性或事件,例如 (some-event)="doSomething($event)"[attr.value]="someProp"
  • 好的,我明白了。非常感谢你这个澄清的答案:)
猜你喜欢
  • 2016-09-09
  • 2018-05-26
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2016-10-07
  • 2017-01-28
相关资源
最近更新 更多