2017-03-16 3 views
0

私は角度2のインターフェイスで作業しようとしています。 私はインターフェイスとコンポーネントを作成しました。角2のインターフェイス

インタフェース:

export interface Items { 
    id: number; 
    title: string; 
    message: string; 
    done: boolean; 
} 

コンポーネント:

export class AddComponent implements OnInit { 
    currentItem: string; 
    todos: any; 

    constructor(private router: Router) { 
     this.currentItem = (localStorage.getItem('currentItem')!==null) ? JSON.parse(localStorage.getItem('currentItem')) : [ ]; 
     this.todos = this.currentItem; 
    } 

    addTodo(item: Items) { 
     this.todos.push({ 
      id: item.id, 
      title: item.title, 
      message: item.message, 
      done: false 
     }); 

     item.title = ''; 
     item.message = ''; 
     localStorage.setItem('currentItem', JSON.stringify(this.todos)); 
     console.log('retorno: ' + this.todos.title + ' titulo: ' + item.title); 

     this.router.navigate(['./list']); 
    } 

    ngOnInit() {} 

} 

HTML:

<div class="container"> 
    <form (submit)="addTodo()"> 

     <div class="form-group"> 
      <label>Id:</label> 
      <input [(ngModel)]="id" class="textfield form-control" name="id"> 
     </div> 

     <div class="form-group"> 
      <label>Titulo:</label> 
      <input [(ngModel)]="title" class="textfield form-control" name="title"> 
     </div> 

     <div class="form-group"> 
      <label>Mensagem:</label> 
      <input [(ngModel)]="message" class="textfield form-control" name="message"> 
     </div> 

     <button type="submit" class="btn btn-success">Salvar</button> 
    </form> 
</div> 

私がエラーを持っている:EXCEPTION: Cannot read property 'id' of undefined

は、それを解決する方法を誰もが知っていますか?

答えて

2

ここで間違っていることがあります。

エラーは、undefinedという引数または引数なしでaddTodo関数を呼び出していることが原因である可能性があります。それがあなたが記述しているエラーの原因です。

もう1つの考えられる問題は、インターフェイスを実装するクラスがない可能性があります。これは厳密には必要ではありませんが、コードをTypeScriptの型安全性をより有効に活用し、エラーを防ぐのに役立ちます。

更新:コード更新では、パラメータなしでaddTodoを実際に呼び出しています。そのため、関数内で定義されていません。

これを解決するにはいくつかの方法がありますが、1つを示します。コンポーネントには、idtitlemessageの各プロパティを追加できます(オブジェクトに配置するか名前を変更して名前を明確にする方がよい場合があります)。これらのプロパティを使用してToDoを追加することができます。したがって、item.iditem.title、およびitem.messageの代わりにthis.id,this.title、およびthis.messageを使用します。これらは、入力したHTMLテンプレートのngModelバインディングを参照しているフィールドと一致します。

+0

ありがとうございました!それは、この方法でそれをやって、私はインターフェイスを必要としません –

+0

本当に、このようにインターフェイスを必要としません。あなたのコンポーネントにフィールドを直接置くのではなく、データを格納するためにインターフェイス/オブジェクトを使用するのはもうちょっと面倒かもしれません。しかし、どちらの方法ももちろん動作します。 –

+1

ありがとう!今はインターフェイスを使ってそれをやろうとします。 –

関連する問題