Двухстороннее связывание Angular 2 с использованием ngModel не работает

Невозможно связать с 'ngModel', поскольку это не свойство know элемента 'input' и нет соответствующих директив с соответствующим свойством

Примечание: я использую альфа 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);

15 ответов

Решение

Angular выпустил свою окончательную версию 15 сентября. В отличие от Angular 1 вы можете использовать ngModel Директива в Angular 2 для двухстороннего связывания данных, но вам нужно написать это немного по-другому, например [(ngModel)] (Банан в коробке синтаксиса). Почти все основные директивы angular2 не поддерживают kebab-case теперь вместо этого вы должны использовать camelCase,

Сейчас ngModel Директива принадлежит FormsModuleвот почему вы должны import FormsModule от @angular/forms модуль внутри imports опция метаданных AppModule(NgModule). После этого вы можете использовать ngModel директива внутри на вашей странице.

приложение /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.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 { }

приложение /main.ts

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

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

Демо Планкр

Ключевые моменты:

  1. ngModel в angular2 действителен, только если FormsModule доступен как часть вашего AppModule.

  2. ng-model синтетически неправильно.

  3. квадратные скобки [..] ссылаются на свойство привязки.
  4. Круговые скобки (..) относятся к привязке события.
  5. когда квадратные и круглые скобки соединяются вместе, как [(..)] означает двухстороннее связывание, обычно называемое банановой коробкой.

Итак, чтобы исправить вашу ошибку.

Шаг 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){

}

В моем случае мне не хватало атрибута "name" в моем элементе ввода.

Согласно финалу Angular2, вам даже не нужно импортировать FORM_DIRECTIVES как предложено выше многими. Однако синтаксис был изменен, так как кебаб-кейс был отброшен для улучшения.

Просто замени ng-model с ngModel и завернуть его в коробку с бананами. Но теперь вы разбили код на два файла:

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);

Ответ, который мне помог: директива [(ngModel)]= больше не работает в rc5

Подводя итог: поля ввода теперь требуют свойства name в виде.

Примечание : чтобы позволить ngModel существовать независимо внутри реактивной формы, мы должны использовать ngModelOptions следующим образом:

       [ngModelOptions]="{ standalone: true }"

Например :

       <mat-form-field appearance="outline" class="w-100">
            <input
              matInput 
              [(ngModel)]="accountType"
              [ngModelOptions]="{ standalone: true }"
            />
 </mat-form-field>

В приложении.module.ts

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

Позже в импорте декоратора @NgModule:

@NgModule({
imports: [
BrowserModule,
FormsModule
]

})

Угловой 2 бета

Этот ответ для тех, кто использует Javascript для angularJS v.2.0 Beta.

Использовать ngModel по вашему мнению, вы должны сообщить компилятору angular, что вы используете директиву под названием ngModel,

Как?

Использовать ngModel В Angular 2 Beta есть две библиотеки, и они 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";
    },

});

Эти вещи отсутствуют / неверны:

  • Импортировать FormsModule в массив импорта модуля (ngModel требует FormsModule)
  • ngModel записывается как: [(ngModel)]="modelName"

Таким образом, он будет работать нормально!

Для более новых версий angular-

  1. -напишите это как [(ngModel)]=yourSearch

2. объявить пустую переменную (свойство) с именем yourSearch в файле.ts

  1. добавить FormsModule в файл app.module.ts из - '@angular/forms';

  2. если ваше приложение запущено, перезапустите его после внесения изменений в его файл module.ts

если вы используете модуль отложенной загрузки, вам необходимо импортировать ngModule и formModule в текущий модуль. пример:

      //shared.module.ts
import { NgModule } from '@angular/core';
import {FormsModule} from '@angular/forms'

imports: [
    FormsModule,]

Вместо ng-модели вы можете использовать этот код:

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

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

внутри вашего app.component.ts

Добавьте код ниже к следующим файлам.

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 ]
})

Надеюсь это поможет

Добавление свойства имени решило проблему для меня

Импортируйте FormsModule в свой AppModule для работы с двусторонней привязкой [(ngModel)] с вашим

Другие вопросы по тегам