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

发生这种情况是因为您在控制器根函数中调用工厂。每次加载控制器时,它都会再次调用工厂。

我建议这个plunker 作为解决方案。也许它不是最好的,但工作正常。

在这种情况下,我将列表实例保存在工厂内的一个变量中,并且只加载一次。如果您需要刷新,那么您可以调用不同的函数来强制刷新到服务器端。

这里有几个可能的解决方案:

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 回答