2016-06-17 9 views
0

コントローラのコンストラクタでコントローラに必要なデータがロードされるJohn PapaのController Activation Processをフォローしようとしています。しかし、データがロードされるまで、nullオブジェクトにバインドしようとするAngularのため、私のページが多くのエラーを引き起こしています。角度コントローラデータがロードされるまでデータトリガが発生しない

コントローラの初期化や映画についての情報を取得するために、AJAX呼び出しを行います。その間、HTMLは映画のディレクターに関する情報をロードしようとします。

Controller.js

class MovieController { 
    constructor(movieHttp) { 
    this.movieHttp = movieHttp; 
    this.movie = null; 
    activate(); 
    } 
    activate() { 
    this.movieHttp.getMovie(...).then(movieData => { this.movie = movieData; }); 
    } 
} 

index.htmlを

... 
<span ng-bind="vm.movie.actor.name"></span> 
... 

関数呼び出しにng-bindを変更する以外に、この問題を解決し、次に行うための良い方法はありますif (!this.movie) { return; }

+0

」タグですべてをラップすることができます。 'vm.movi​​e'に値が設定されるまでレンダリングされません(レンダリングもされません)。 – Lex

+0

@Lexこれをやろうとしましたが、コンポーネントが実際に表示されているかどうかだけではありません。私は現在 'ng-cloak'を使ってレンダリングが終了するまでHTMLを隠していますが、' null'オブジェクトの属性にアクセスすることで、JavaScriptエラーが発生し、これを解決しようとしています。しかし、提案に感謝! –

答えて

0

あなたは、CTRLに空のムービーオブジェクトを設定(またはいっそのサービス)、およびAjaxが戻って呼び出したときに、それを更新することができます

class MovieController { 
    constructor(movieHttp) { 
     this.movieHttp = movieHttp; 
     this.movieData = { 
     movie: { 
      actor: { 
       name: '' 

      }, 
      title: '' 
     } 
     }; 
     activate(); 
    } 
    activate() { 
    this.movieHttp.getMovie(...).then(movieData => { this.movieData.movie = movieData;}) 
    } 
} 

とあなたのhtml:

<span ng-bind="vm.movieData.movie.actor.name"></span> 

をそれオブジェクトが非常に複雑な場合は迷惑になるかもしれませんが、一度しか設定しないと、オブジェクトの構造が何であるかを簡単に把握することができます。

コントローラがインスタンス化される前に、約束がreolvedあれば強制的にルータresolveプロパティを使用して(と自分のコントローラにパラメータとして解決されたオブジェクトを注入する) UI-ルータはそのためのconvinent方法を持っている別の解決策は、(https://github.com/angular-ui/ui-router/wiki)角度のデフォルトルータにもこのオプションがあります(https://docs.angularjs.org/api/ngRoute/provider/ $ routeProvider)

+0

提案していただきありがとうございます。ええ、私は実際にデータを読み込むために以前は 'resolve'を使っていました。しかし、John Papaの規則に従い、コントローラーで使用されるデータをデータにロードする必要があります。そのため、私はその状況にリファクタリングしていました。私は、ajaxが返るまでコントローラを初期化するためのスタブオブジェクトを作成しました。 –

関連する問題