0

角度のあるパターンにはエレガントなソリューションが必要だと確信していますが、それを見ることはできません。

問題:

  • すべてのデータは、アプリケーションの開始時に一括してロードされます。
  • /#/users/13ユーザーがURL を入力して特定のビュー ( など) を要求する
  • 問題: データがまだロードされていない

サーバー

私のバックエンド サーバーは、JSON として一度にすべてのテーブルから利用可能なすべてのデータを返します (それほど多くはありません)。

{users: [...], groups: [...], stuff: [...], ...}

サービス

メソッドを使用してAngularサービスにラップしましたupdate()。これは、成功すると、応答の要素を に配置します。これは$rootScope、アプリケーション全体が取り組んでいるものだからです。

.success(function (data) {
    $rootScope.users = data.users;
    $rootScope.groups = data.groups;
    ...
}

アプリが起動すると、mainController で update メソッドが呼び出されます。

コントローラー/ビュー

のような特定のユーザー向けのビューを作成すると/users/:id、アプリケーション内をナビゲートする際にすべてが正常に機能します。ここまでは順調ですね。

のようなビューへのディープ リンクを使用してアプリケーションを起動すると#/users/13、データがまだ読み込まれていないため、コントローラーは通常どおりデータをリンクできず、エラーが発生します。

$scope.user = $scope.users[$routeParams.id];

アイデア

これを解決するために私がしなければならなかったすべてのアイデアは、何らかの形で問題があります。

  • コントローラーで定義されていないものに反応$scope.usersすることでエラーを回避できますが、データがそこにある場合、どのようにビューをリロードしますか?
  • resolveそのサービス結果の promise に依存するルートのセクションを設定すると、データが既に読み込まれている場合でも、ルートが使用されるたびにリロードされます (データはアプリの開始時にのみ読み込まれる必要があります)。
  • データ部分ごとにサービスを設定し、各結果に対して promise を使用すると、サーバーからデータを何度もフェッチすることになります。
  • 「データがロードされました」という明示的なフラグを設定し、その状態に基づいて物事を変更することは、私には完全に間違っているようです
  • フェッチされたデータの大きな塊は 1 つしかないため、promise を操作すると、一般的に頭痛の種になりますが、その単一の要素を参照したいと考えています。

ですから、そのようなセットアップの「Angular way」が欠けているだけだと思います(おそらく盲目です)。

4

1 に答える 1

1

常にロードする必要があるデータがある場合は、アプリの「app.run」にロードできます。これは常に他の何よりも先に行われます。まだ非同期であるため、http-requests から待機する必要はありませんが、それを使用して、データが常にサーバーから読み込まれるようにすることができます (app.run は 1 回しか実行されないため、1 回だけ)。 )。データを取得したら、それをサービスまたは rootScope に保存して、コントローラーや他のユーザーが使用できるようにします。

これにより、データをロードする呼び出しが常に実行され、一度だけ実行されることが保証されます。2 番目の部分はデータを待機するため、引き続き解決を使用します。

  1. サービスまたは rootScope をチェックして、データが既に存在するかどうかを確認します。
  2. もしそうなら、素晴らしい。
  3. そうでない場合は、watch を使用して待機します。
  4. promise が解決されたら、ビューを表示します。

データをサービスに保存するということは、次のようなものを使用することを意味します。

app.factory('DataObject', [function(){
  return {};
}]);

サービスはシングルトンであるため、このオブジェクトを使用するものはすべて同じデータを共有します。したがって、解決はそれに依存し、それを使用してデータが存在するかどうかを確認できます。rootScope を同じ目的で使用することもできますが、サービスを使用すると、rootScope でポイ捨てする必要がなくなります。rootScope の方が簡単に監視できます。


編集: データの準備ができているかどうかコントローラーをチェックインする方法に進みたい場合は、データがロードされたら$scope.$watchをトリガーする必要があります。

于 2013-11-14T14:24:31.003 に答える