ngModelを使用したAngular 2双方向バインディングが機能しない


101

「ngModel」にバインドできません。「input」要素の既知のプロパティではなく、対応するプロパティを持つ一致するディレクティブがないためです。

注:私はalpha.31を使用しています

import { Component, View, bootstrap } from 'angular2/angular2'

@Component({
    selector: 'data-bind'
})
@View({
    template:`
        <input id="name" type="text" 
            [ng-model]="name" 
            (ng-model)="name = $event" />
        {{ name }}
    ` 
})
class DataBinding { 
    name: string;

    constructor(){
        this.name = 'Jose';
    }
}

bootstrap(DataBinding);

回答:


151

Angularは9月15日に最終版をリリースしました。Angular 1と​​は異なりngModel、Angular 2で双方向のデータバインディングにディレクティブを使用できますが、[(ngModel)]ボックス構文のBanana)のように少し異なる方法で記述する必要があります。ほとんどすべてのangular2コアディレクティブはkebab-case現在サポートしていませんcamelCase。代わりにを使用する必要があります。

ngModelまでディレクティブ属しFormsModuleなぜあなたがすべきだと、から内部モジュールのメタデータオプション(NgModule)。その後、ページ内でディレクティブを使用できます。importFormsModule@angular/formsimportsAppModulengModel

app / app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  template: `<h1>My First Angular 2 App</h1>
    <input type="text" [(ngModel)]="myModel"/>
    {{myModel}}
  `
})
export class AppComponent { 
  myModel: any;
}

app / app.module.ts

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent }   from './app.component';

@NgModule({
  imports:      [ BrowserModule, FormsModule ], //< added FormsModule here
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})

export class AppModule { }

app / main.ts

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';

const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);

デモプランカー


46

キーポイント:

  1. angular2のngModelは、FormsModuleがAppModuleの一部として利用できる場合にのみ有効です。

  2. ng-model 構文的に間違っています。

  3. 角かっこ[..]はプロパティバインディングを示します。
  4. 中かっこ(..)はイベントバインディングを示します。
  5. [(..)]が一般的にバナナボックスと呼ばれる2方向のバインディングを参照するように、四角と中かっこを組み合わせた場合。

したがって、エラーを修正します。

ステップ1: FormsModuleをインポートする

import {FormsModule} from '@angular/forms'

手順2: AppModuleのインポート配列として追加します。

imports :[ ... , FormsModule ]

ステップ3:ng-model ngModelをバナナボックスに変更し、

 <input id="name" type="text" [(ngModel)]="name" />

注:また、以下と同様に、双方向のデータバインディングを個別に処理できます。

<input id="name" type="text" [ngModel]="name" (ngModelChange)="valueChange($event)"/>

valueChange(value){

}

9

Angular2 finalにFORM_DIRECTIVESよると、多くの人が上記のようにインポートする必要はありません。ただし、改善のためにkebab -caseが削除されたため、構文が変更されました。

と入れ替えng-modelngModelバナナの箱に入れてください。しかし、コードを次の2つのファイルに分割しました。

app.ts:

import { Component } from '@angular/core';

@Component({
  selector: 'ng-app',
  template: `
    <input id="name" type="text" [(ngModel)]="name"  />
    {{ name }}
  `
})
export class DataBindingComponent {
  name: string;

  constructor() {
    this.name = 'Jose';
  }
}

app.module.ts:

import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { DataBindingComponent } from './app'; //app.ts above

@NgModule({
  declarations: [DataBindingComponent],
  imports:      [BrowserModule, FormsModule],
  bootstrap:    [DataBindingComponent]
})
export default class MyAppModule {}

platformBrowserDynamic().bootstrapModule(MyAppModule);


6

私を助けた答え: ディレクティブ[(ngModel)] =はrc5ではもう機能しません

まとめると、入力フィールドnameにはフォームのプロパティが必要になりました。


はい、同じ問題がありました。name属性を入力して作業しました
vrbsm '16

一体何なの?なぜその属性さえ必要なのですか?これは私にとって最も予期しない解決策でした。
ニカKasradze

4

app.module.ts

import { FormsModule } from '@angular/forms';

@NgModuleデコレータのインポートの後半:

@NgModule({
imports: [
BrowserModule,
FormsModule
]

})

3

Angular 2 Beta

この回答は、angularJS v.2.0 BetaでJavascriptを使用する人を対象としています。

ngModelビューで使用するには、というディレクティブを使用していることをアンギュラーのコンパイラーに伝える必要がありますngModel

どうやって?

使用するngModelには、angular2 Betaに2つのライブラリがng.common.FORM_DIRECTIVESあり、それらはおよびng.common.NgModelです。

実際にng.common.FORM_DIRECTIVESは、フォームを作成するときに役立つディレクティブのグループにすぎません。NgModelディレクティブも含まれています。

app.myApp = ng.core.Component({
    selector: 'my-app',
    templateUrl: 'App/Pages/myApp.html',
    directives: [ng.common.NgModel] // specify all your directives here
}).Class({
    constructor: function () {
        this.myVar = {};
        this.myVar.text = "Testing";
    },

});

FYI NgModelはFORM_DIRECTIVESにあるため、次のことも可能です。ディレクティブ:[ng.common.FORM_DIRECTIVES]
Peter J. Hart

1
@ PeterJ.Hart、実際ng.common.NgModelにはディレクティブの定義が含まれていngModelます。フォームの場合に役立つng.common.FORM_DIRECTIVESいくつかのディレクティブをグループ化していngModelます。そのため、フォームに含まれるすべてのディレクティブを含めたくありませんng.common.FORM_DIRECTIVES
Abhilash Augustine '28

2

AppModuleにFormsModuleをインポートして、双方向バインディング[(ngModel)]


1
可能な場合は、コードだけではなく、追加の説明を提供できるように努力してください。このような回答は、コミュニティのメンバー、特に新しい開発者がソリューションの推論をよりよく理解するのに役立ち、フォローアップの質問に対処する必要を防ぐのに役立つので、より役立つ傾向があります。
ラジャン

0

ng-modelの代わりに、次のコードを使用できます。

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  template: `<input #box (keyup)="0">
    <p>{{box.value}}</p>`,
})
export class AppComponent  {}

app.component.ts内


0

以下のコードを以下のファイルに追加します。

app.component.ts

<input type="text" [(ngModel)]="fname" >
{{fname}}
export class appcomponent {
fname:any;
}

app.module.ts

import {FormsModule} from '@angular/forms';
@NgModule({
imports: [ BrowserModule,FormsModule ],
declarations: [ AppComponent],
bootstrap:    [ AppComponent ]
})

お役に立てれば

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.