2017-01-15 8 views
0

私は標準のangle2アプリ(より具体的にはtodoアプリ)を構築しています。私も@Ngrx/storeを追加しました。ng2 [無効] = "!myInput.value"は正しく動作しません。

私はページをロードする最初の時間は、ボタンは無効になりますが、私は入力ボックスにいくつかの値を入力すると、ボタンを有効にする必要があり、それが無効になったまま...

app/app.component.ts

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

 
@Component({ 
 
    selector: 'my-app', 
 
    template: ` 
 
    <h1>Hello {{name}}</h1> 
 
    <div> 
 
    <add-todo></add-todo> 
 
    </div>`, 
 
}) 
 
export class AppComponent { name = 'Angular'; }

app/components/add-todo/add-todo.component.ts

import { Component, ViewChild, ElementRef } from '@angular/core'; 
 

 
@Component({ 
 
    moduleId: module.id, 
 
    selector: 'add-todo', 
 
    template: ` 
 
    Create new todo 
 
    <input #myInput /> 
 
    <button (click)="addTodo()" [disabled]="!myInput.value">Add</button>` 
 
}) 
 
export class AddTodoComponent { 
 
    @ViewChild('myInput') input: ElementRef; 
 

 
    constructor() {} 
 

 
    addTodo(): void { 
 
    alert(this.input.nativeElement.value); 
 
    } 
 
}

+0

変化の検出については気をつけてください。それはあなたを助けるかもしれないhttp://stackoverflow.com/questions/41608443/angular2-what-does-binding-event-to-0-mean – yurzui

+1

うーん...私はあなたがやろうとしていると思うが、もしnativElement (通常の古いHTMLの "value"属性に対して)値を持っていますが、有効/無効を切り替えたいのですか?それがうまくいくかどうかはわかりませんが、nativeElement属性がそのまま「Angular」に見えるものかどうかはわかりません。私が思うには、の値をバインドするか、入力(changeなど)のイベントにバインドし、true/falseを決定する値を設定します(onChangeハンドラのように、 "if(val)disabled = false"またはそのようなもの)。 –

+0

ngModelを追加しても機能しませんでしたが、[yurzui](https://stackoverflow.com/users/5485167/yurzui)のように(keyup)= "0"を追加するだけで解決しました。 – Aytacworld

答えて

1

を使用するようにコードを更新...

をngModelを使用して、フォームコントロールの変化状態と有効性を追跡ngModelと期待どおりに動作するはずです

import { Component, ViewChild, ElementRef } from '@angular/core'; 

@Component({ 
    moduleId: module.id, 
    selector: 'add-todo', 
    template: ` 
    Create new todo 
    <input #myInput [(ngModel)]="inputFieldValue" /> 
    <button (click)="addTodo()" [disabled]="!myInput.value">Add</button>` 
}) 
export class AddTodoComponent { 

    @ViewChild('myInput') input: ElementRef; 
    public inputFieldValue:string = ''; 

    constructor() {} 

    addTodo(): void { 
    alert(this.input.nativeElement.value); 
    } 
} 
+0

スニペットをコピー/ペーストしましたが、次のエラーが表示されます。 zone.js:420未処理プロミス拒否:未定義のプロパティ 'stack'を設定できません。ゾーン:;タスク:Promise.then;値:TypeError:SyntaxError.set [as stack](http:// localhost:3000/node_modules/@angular/compiler/bundles/compiler.umd.js:1628:63)の未定義 のプロパティ 'stack'を設定できません。 .. – Aytacworld

+0

フォームモジュールをプロジェクトにインポートしましたか? –

+0

私はゾーンバージョン0.7.5を使用していましたが、これを0.7.4に戻してこの問題を修正しました。現在は[github-zone-issue](https://github.com/angular/angular-cli/issues/3975 #issuecomment-272364925) – Aytacworld

0

あなたはこの方法で何をしている場合:ドキュメントhttps://angular.io/docs/ts/latest/guide/forms.htmlから

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

@Component({ 
    selector: 'add-todo', 
    template: ` 
    Create new todo 
    <input #todoTitleInput [(ngModel)]="todoTitle"/> 
    <button (click)="addTodo(todoTitleInput.value)" [disabled]="!todoTitle">Add</button> 
    `, 
}) 
export class AddTodoComponent { 
    addTodo(title: string): void { 
    alert(title); 
    } 
} 
関連する問題