2016-05-10 7 views
1

UPDATE これは、Angularチームがうまく対応できるように見える問題です。ゾーンは、エラー発生後の変化から退会された場合、私はよく分からない - エラーが発生した後、変更の検出が中断するように見える


https://github.com/angular/angular/issues/2413

私は角度の(ベータ版15)の変化の検出がエラーに遭遇した後に動作を停止するようだという問題があります。

エラーを再現する最も簡単な方法は、nullまたはundefinedのプロパティを参照することです。

問題はhereと表示されます。

@Component({ 
    selector: 'shell', 
    template: ` 
    <h3>Shell</h3> 
    <p>{{dummy.myArray[0].text}}</p> 
    <button (click)="getUsers()">Get users!</button> 
    <button (click)="setDummyTextToNull()">Break stuff!</button> 

    <ul> 
     <li *ngFor="#user of users">{{user.login}}</li> 
    </ul> 
    ` 
}) 

export class ShellComponent implements OnInit { 

    public params; 
    public users; 
    public dummy; 

    constructor(private _router:Router, 
    public routeParams:RouteParams, 
    private _ghService:GithubService) { 

    this.params = this.routeParams; 
    this.subscribe(); 
    } 

    ngOnInit() { 
    this.dummy = { 
     myArray: [ 
     { text: 'Some dummy text' } 
     ] 
    }; 
    } 

    setDummyTextToNull() { 
    this.dummy = null; 
    } 

    getUsers() { 
    this.getUsers(); 
    } 

    subscribe() { 
    this._ghService.users$.subscribe(data => this.onResponse(data), err => { 
     console.warn('Could not fetch', err.status) 
    }); 
    } 

    getUsers() { 
    this._ghService.loadUsers(); 
    } 

    onResponse(data) { 
    console.log('Successfully fetched users', data); 

    this.users = this.shuffle(data); 
    } 

    shuffle(array) { 
    var currentIndex = array.length, temporaryValue, randomIndex; 

    // While there remain elements to shuffle... 
    while (0 !== currentIndex) { 

     // Pick a remaining element... 
     randomIndex = Math.floor(Math.random() * currentIndex); 
     currentIndex -= 1; 

     // And swap it with the current element. 
     temporaryValue = array[currentIndex]; 
     array[currentIndex] = array[randomIndex]; 
     array[randomIndex] = temporaryValue; 
    } 

    return array; 
    } 

} 

「ユーザーを取得する」をクリックすると、githubユーザーがフェッチされ、リストがシャッフルされます。これを繰り返すことで、リストが再ソートされていることがわかります。テンプレートにnullのプロパティを参照させると、変更の検出が機能しなくなったように見えます。

私が期待しているのは、そのボタンをクリックすると繰り返しエラーが発生することですが、実際にはテンプレート内のエラーによってアプリがクラッシュしてリフレッシュする必要があります。

これを経験したことがありますが、これ以外にもngIfと「elvis演算子」をどこからでも使用できますか?

答えて

1

これは設計通りです。

あなたは

{{dummy?.myArray[0].text}} 

{{dummy.myArray[0].text}} 

を変更する場合には、これは私にとって大きな問題のように思えるエラー

+0

を取得するべきではありません。テンプレート内に存在しないプロパティを参照すると、基本的にアプリケーションがクラッシュし、フルリフレッシュが必要になる – garethdn

+0

私は強く型の言語から来て、DartでAngular2を使用しています。私はこの動作に問題ありません。あなたがJSの世界から来たのであれば、あなたの期待はおそらく異なるでしょう。私は '? 'の振る舞いをデフォルトにするために議論したところで問題を見つけました。 Miskoが陽性だったように聞こえたが、まだ最高のPrioではなかった。 –

関連する問題