2015-12-30 9 views
23

TypeScriptを使用して簡単にAngular2アプリケーションを作成したいと思います。かなりシンプルだが、私が望むものを達成することはできない。Angular2 - TypeScript:AppComponentでタイムアウト後に数値をインクリメントする

テンプレートにプロパティ値を表示したいとします。そして、setTimeoutを使って1秒後に同じものを更新したいと思います。

Plunkrコードはここにある:Code on Plunkr

私が書いたもの

はここにある:私はことはできませんよ、なぜ

Uncaught SyntaxError: Unexpected token ; 

:私はこのコードを使用すると

import {Component} from 'angular2/core'; 

interface Hero { 
    id: number; 
    name: string; 
} 

@Component({ 
    selector: 'my-app', 
    template:`<h1>Number Increment</h1><p>{{n}}</p>` 
}) 
export class AppComponent { 
    public n : number = 1; 
    setTimeout(function() { 
    n = n + 10; 
    }, 1000); 
}  

私は、次のエラーを取得していますnにアクセスします。これはJavaScriptで使用したのと同じスコープです。私が間違っていなければ、TypeScriptでも純粋なJavaScriptを使うことができます。

私も

export class AppComponent { 
    public n : number = 1; 
    console.log(n); 
} 

を試してみました。しかし、私は、コンソールにnの値を見ることができないです。

私は

export class AppComponent { 
    public n : number = 1; 
    console.log(this); 
} 

を試したとき、私は上記と同じエラーを取得しています。なぜ私たちはこの場所でこれにアクセスできないのですか?私は、thisはJavaScriptのように現在のコンテキストを参照していると思います。

ありがとうございます。

答えて

61

これは有効なタイスクリプトコードではありません。あるクラスの本体にメソッド呼び出しを行うことはできません。

export class AppComponent { 
    public n: number = 1; 
    setTimeout(function() { 
    n = n + 10; 
    }, 1000); 
} 

代わりに、クラスのコンストラクタのsetTimeoutコールを移動します。

export class AppComponent { 
    public n: number = 1; 

    constructor() { 
    setTimeout(() => { 
     this.n = this.n + 10; 
    }, 1000); 
    } 

} 

また、活字体であなただけのこのを経由して、クラスのプロパティやメソッドを参照することができます。

+2

ありがとう@toskvそれは働いた。実際には、 'setTimeout'関数内で' this'リファレンスが動作しませんでした。そのためには、[更新されたPlunkrコード](http://plnkr.co/edit/RhYhVS84wnOdPuhYUG1E?p=preview)にあるように 'that'と' this'を使用しなければなりませんでした。 – Mahisha

+7

arrowの関数を使うべきです。これらのキーワードは、別の変数に格納することなく***キーワードを使用することができます。 (例: 'setTimeout(()=> {this.n + = 10;}、1000); – Romain

+0

これはsetTimeoutでもうまく動作するように、矢印関数を使用するように答えを更新しました:) – toskv

6

処理をクラスコンストラクタまたはOnInitフックメソッドに配置する必要があります。

関連する問題