2017-01-09 6 views
0

私は、AppCtrlというメインのctrを使用するアプリケーションを持っています。これは、グローバル変数、ヘルパー、データを共有するために使用します。コントローラーがロードされる前の角度実行条件

私は各ビューに1つのコントローラがあるので、ユーザがページを更新したり、初めて自分のアプリに入るたびに、特定の順序でタスクを実行する必要がありますが、それらは分離されたコントローラにあります。

たとえば、AppCtrl私のデータベースからユーザデータをロードする必要がありますが、ルートまたはセカンダリコントローラが必要です。HomeCtrlに電話をかけることができます。 info AppCtrlから。

私はコントローラ間でデータを共有するために$scope varを使用しています。

したがって、AppCtrl実行の終了が処理を開始するまで、HomeCtrlが待機するようにするにはどうすればよいですか。

EDIT:

私は私のHomeCtrlの私のAppCtrlと例を共有するために、ペーストビン、http://pastebin.com/CUtTmKzTを作成しました。分かりやすくするために、私は多くのコンテンツを削除し、いくつかの署名を残すだけで、達成しようとしていることを理解することができます。

もっと良く説明するために、私はすべてのページロード時にいくつかのメソッドを実行して、私のAPIからいくつかのデータを照会し、すべてのコントローラー間で共有したいと思っています。私はこのアプリケーションを大量に使用するため、これを一度だけ行うことができます。ユーザデータは私の$rootScope上に存在する場合、それはそれがメソッドを呼び出しますない場合

ので、私は、ユーザーがアプリにアクセスした後に呼び出されるメソッドhandleLoginSuccessを持っている私のペーストビンコード以下、それは、チェックしますこのデータをsetCurrentUserで処理し、そうでない場合は、このデータをAPIから照会するメソッドgetUserDataを呼び出し、それを処理するために他のメソッドを呼び出します。

+0

ここで角度フレームワークの知識にはいくつかのギャップがあり、非常に難しくなります。まず、HTMLをレンダリングする '$ digest'サイクルは、コントローラがロードする順序には関係しません。第二に。各コントローラはそれ自身の '$ scope 'を持っているので、' $ scope'を使ってデータを共有すると、バグのトラブルシューティングに厄介なことが起こる可能性があります。ディレクティブやコンポーネントを代わりに使用するか、ルーターを使用してビューを管理することを検討してください。 – Claies

+0

@ Claies、データを共有するために指示やコンポーネントを使用する方法の例を教えてください。スコープを使用せずにデータベース間で共有する方法がわからないからです。また、私はhtmlレンダリングについても、メソッドの実行については言及していませんでした。 – Terkhos

+1

シングルトンオブジェクトであるプロバイダ(サービスまたは工場)にデータを共有する方が良いでしょう。ここでは、HTMLに階層的な性質を暗示しようとしているため、ディレクティブとコンポーネントについて言及していますが、コントローラは厳密には厳密には守られていません。 – Claies

答えて

0

https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md

^ベストガイド。また、$ scopeの使い方に関するチュートリアルを調べます。

私が角を学び、まだ学んでいるやり方は、コンポーネントのことを考えることです。これにより、依存関係の問題や奇妙なダイジェストの問題が制限されます。

+0

ええ、それは私も学んだものですが、私はこのデータをどこでも共有しなければならないので、私は自分自身を失いました。私はいつもDBにぶつかることができないし、クッキーやストアに保存することもできません。それはかなり大きいです。ありがとう、私はガイドを見てください – Terkhos

+0

DBに触れているサービスを作成し、必要に応じて他のコントローラの中でそのサービスを使用する必要があるかもしれないように思えます。できるだけ別々のものを保つのが好きなので、カップリングの問題はありません。 – DDelgro

+0

はい、それは私がやったことです、私はそれらのいくつかを持って、私もこのデータのために持っていたが、私はデータベースのヒットを減らさなければならなかった。私はサービスを使用する場合、私はどこかにデータを '保存'する必要があるので、もう一度それを打つ必要はありませんか?どのように私はサービスで、そして '$スコープ'を使わないでそれをすることができますか? – Terkhos

0
In 1st controller like AppCtrl,you can pass the data like: 

$rootScope.$broadcast('scanner-started', { any: {} }); 

then in second controller HomeCtrl,you can fetch the data like- 

$scope.$on('scanner-started', function(event, args) { 
    var anyThing = args.any; 
    // do what you want to do 
}); 
+0

'HomeCtrl'で同時に実行される多くのメソッドがあるので、それは動作しません、私はコントローラの実行が必要/' AppCtrl '。これは、リスナーをたくさん追加する必要があるため、良い選択肢のようには聞こえません。 – Terkhos

0

ngRouteまたはui-routerを検討する必要があります。 Ui-routerは、親状態から子状態に日付を共有する状態をネストしています。そして、あなたは親の状態からいくつかの約束を解決することができ、子供を許可するかどうかを決めたり、ユーザーをログイン状態にリダイレクトすることができます。角度を使用するhttps://github.com/angular-ui/ui-router/wiki/Nested-States-and-Nested-Views

+0

私はそれを試みましたが、私の 'HomeCtrl'はまだ 'AppCtrl'の前に実行されています。私は 'main'という抽象状態を作成し、' home'状態を 'main.home'に移動し、メイン状態のコントローラを' AppCtrl'として配置しました。私は何か違うことをすべきか? – Terkhos

関連する問題