Angular 2+ 和 Observables:无法绑定到 'ngModel',因为它不是 'select' 的已知 属性
Angular 2+ and Observables: Can't bind to 'ngModel' since it isn't a known property of 'select'
编辑:更新的 Plunkr:http://plnkr.co/edit/fQ7P9KPjMxb5NAhccYIq?p=preview
这部分有效:
<div *ngFor="let entry of entries | async">
Label: {{ entry.label }}<br>
Value: {{ entry.value }}
</div>
但是 select 框有问题,错误消息是:
无法绑定到 'ngModel',因为它不是 'select'
的已知 属性
整个组件:
//our root app component
import {Component} from '@angular/core';
import {NgFor} from '@angular/common';
import {HTTP_PROVIDERS, Http} from '@angular/http';
import 'rxjs/Rx';
import {Observable} from 'rxjs/Rx';
@Component({
selector: 'my-app',
providers: [HTTP_PROVIDERS],
template: `
<select [(ngModel)]="selectValue" name="selectValue">
<option *ngFor="let entry of entries | async"
[value]="entry.value">{{entry.label}}</option>
</select>
<div *ngFor="let entry of entries | async">
Label: {{ entry.label }}<br>
Value: {{ entry.value }}
</div>
`,
directives: [NgFor]
})
export class App {
entries: any = {};
selectValue:any;
constructor(private _http: Http) {
this.entries = this._http.get("./data.json")
.map(res => res.json());
}
}
和data.json
[
{
"timestamp": 0,
"label": "l1",
"value": 1
},
{
"timestamp": 0,
"label": "l2",
"value": 2
},
{
"timestamp": 0,
"label": "l3",
"value": 3
}
]
执行以下操作必须使用 [ngValue]
而不是 [val]
<select [(ngModel)]="selectValue">
<option *ngFor="let entry of entries | async"
[ngValue]="entry.value">{{entry.label}}
</option>
</select>
>=RC.5
需要导入 FormsModule
才能使 ngModel
可用
@NgModule({
imports: [BrowserModule /* or CommonModule */,
FormsModule, ReactiveFormsModule],
...
)}
class SomeModule {}
<= RC.4
在config.js
中添加
'@angular/forms': {
main: 'bundles/forms.umd.js',
defaultExtension: 'js'
},
在main.ts
中添加
import {provideForms, disableDeprecatedForms} from '@angular/forms';
bootstrap(App, [disableDeprecatedForms(),provideForms()])
另见
您需要将以下内容添加到您的 app.module.ts
文件中。
import { FormsModule } from '@angular/forms';
而且,
@NgModule({
imports: [
FormsModule,
...
]})
尽管我已经在我的组件的 *.module.ts
文件中导入了 FormsModule
,但我的测试套件中还是发生了这种情况。
在我的 *.component.spec.ts
文件中,我需要将 FormsModule
和 ReactiveFormsModule
添加到 configureTestingModule
的导入列表中:
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
...
TestBed.configureTestingModule({
imports: [
FormsModule,
ReactiveFormsModule,
....],
providers: [MyComponent, ...],
declarations: [MyComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
这解决了我的问题。
在app.modules.ts之后
import { NgModule } from '@angular/core';
放:
import { FormsModule } from '@angular/forms';
然后在
imports: [
BrowserModule
],
像这样插入 FormsModule:
imports: [
BrowserModule,
FormsModule
],
以上错误是因为您没有导入 FormsModule,ngModel 存在于 FormsModule 包中,因此,要消除此错误,请添加 import {FormsModule} from '@angular/forms'
并在 app.module.ts 中的导入中添加 FormsModule class.
编辑:更新的 Plunkr:http://plnkr.co/edit/fQ7P9KPjMxb5NAhccYIq?p=preview
这部分有效:
<div *ngFor="let entry of entries | async">
Label: {{ entry.label }}<br>
Value: {{ entry.value }}
</div>
但是 select 框有问题,错误消息是:
无法绑定到 'ngModel',因为它不是 'select'
的已知 属性整个组件:
//our root app component
import {Component} from '@angular/core';
import {NgFor} from '@angular/common';
import {HTTP_PROVIDERS, Http} from '@angular/http';
import 'rxjs/Rx';
import {Observable} from 'rxjs/Rx';
@Component({
selector: 'my-app',
providers: [HTTP_PROVIDERS],
template: `
<select [(ngModel)]="selectValue" name="selectValue">
<option *ngFor="let entry of entries | async"
[value]="entry.value">{{entry.label}}</option>
</select>
<div *ngFor="let entry of entries | async">
Label: {{ entry.label }}<br>
Value: {{ entry.value }}
</div>
`,
directives: [NgFor]
})
export class App {
entries: any = {};
selectValue:any;
constructor(private _http: Http) {
this.entries = this._http.get("./data.json")
.map(res => res.json());
}
}
和data.json
[
{
"timestamp": 0,
"label": "l1",
"value": 1
},
{
"timestamp": 0,
"label": "l2",
"value": 2
},
{
"timestamp": 0,
"label": "l3",
"value": 3
}
]
执行以下操作必须使用 [ngValue]
而不是 [val]
<select [(ngModel)]="selectValue">
<option *ngFor="let entry of entries | async"
[ngValue]="entry.value">{{entry.label}}
</option>
</select>
>=RC.5
需要导入 FormsModule
才能使 ngModel
可用
@NgModule({
imports: [BrowserModule /* or CommonModule */,
FormsModule, ReactiveFormsModule],
...
)}
class SomeModule {}
<= RC.4
在config.js
中添加
'@angular/forms': {
main: 'bundles/forms.umd.js',
defaultExtension: 'js'
},
在main.ts
中添加
import {provideForms, disableDeprecatedForms} from '@angular/forms';
bootstrap(App, [disableDeprecatedForms(),provideForms()])
另见
您需要将以下内容添加到您的 app.module.ts
文件中。
import { FormsModule } from '@angular/forms';
而且,
@NgModule({
imports: [
FormsModule,
...
]})
尽管我已经在我的组件的 *.module.ts
文件中导入了 FormsModule
,但我的测试套件中还是发生了这种情况。
在我的 *.component.spec.ts
文件中,我需要将 FormsModule
和 ReactiveFormsModule
添加到 configureTestingModule
的导入列表中:
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
...
TestBed.configureTestingModule({
imports: [
FormsModule,
ReactiveFormsModule,
....],
providers: [MyComponent, ...],
declarations: [MyComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
这解决了我的问题。
在app.modules.ts之后
import { NgModule } from '@angular/core';
放:
import { FormsModule } from '@angular/forms';
然后在
imports: [
BrowserModule
],
像这样插入 FormsModule:
imports: [
BrowserModule,
FormsModule
],
以上错误是因为您没有导入 FormsModule,ngModel 存在于 FormsModule 包中,因此,要消除此错误,请添加 import {FormsModule} from '@angular/forms'
并在 app.module.ts 中的导入中添加 FormsModule class.