AngularJS工厂只调用一次

时间:2013-10-29 01:59:29

标签: angularjs

我有一个测验类型的应用程序,其工厂可以从服务器获取问题列表:

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

然后我在我的控制器中调用这个工厂:

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

然后,当我循环问题时,我在问题和回答部分视图之间来回切换。问题是每次加载问题视图时,它都会从服务器重新加载工厂json。但我希望它只在我加载应用程序时才这样做,而不是每次我加载使用该控制器的局部视图时。

你在棱角分明的方式是什么?

由于

2 个答案:

答案 0 :(得分: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);
        });
     }

  }

};
});

答案 1 :(得分:2)

这是因为您在控制器根函数内调用工厂。 每次加载控制器时,它都会再次调用工厂。

我建议plunker as solution。也许它不是最好的,但工作正常。

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

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

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);  
      }
};
});

我希望它有所帮助。