2

サーバーから質問のリストを取得するファクトリを備えたクイズタイプのアプリケーションがあります。

xoryApp.factory('questionService', function($http) {  
  return {
  qdata : function(callback) {
      $http.get('/static/question.json').success(callback);
  }
};
});

次に、コントローラーでこのファクトリを次のように呼び出します。

questionService.qdata(function(results) {
    $scope.qdata = results;
});

次に、質問をループしながら、質問と回答の部分ビューを交互に切り替えます。問題は、質問ビューが読み込まれるたびに、サーバーからファクトリ json が再読み込みされることです。しかし、そのコントローラーを使用する部分ビューをロードするたびにではなく、アプリをロードするときに一度だけ実行したいのです。

角度でそれを達成する方法は何ですか?

ありがとう

4

2 に答える 2

4

サーバー呼び出しの結果をサービス メソッド内にキャッシュすれば、準備完了です。

xoryApp.factory('questionService', function($http) {
var questions;
  return {
  qdata : function(callback) {
      if(questions) {
          callback(questions);
      }
      else {
        $http.get('/static/question.json').success(function(data) {
         questions=data;
         callback(questions);
        });
     }

  }

};
});
于 2013-10-29T02:56:08.690 に答える
2

これは、コントローラーのルート関数内でファクトリーを呼び出しているために発生します。コントローラがロードされるたびに、ファクトリが再度呼び出されます。

このプランカーを解決策として提案します。多分それは最高ではありませんが、うまくいきます。

この場合、リスト インスタンスをファクトリ内の変数に保存し、一度だけロードします。更新が必要な場合は、別の関数を呼び出して、サーバー側に更新を強制することができます。

ここにいくつかの可能な解決策があります:

app.factory('questionService', function($http) {  
  var result;
  return {
      qdata : function(callback) {
          return result;
      },
      fecthData : function(callback) {
          result = $http.get('question.json').success(callback);
          return result;
      }
};
});

app.factory('questionService2', function($http) {  
  var result;
  return {
      qdata : function(callback) {
          if (!result) {
              result = $http.get('question2.json').success(callback);  
          }
          return result;
      },
      refreshQdata : function (callback) {
         return $http.get('question2.json').success(callback);  
      }
};
});

お役に立てば幸いです。

于 2013-10-29T02:22:46.910 に答える