AngularJS工厂只调用过一次

AngularJS工厂只调用过一次,angularjs,Angularjs,我有一个测验类型的应用程序,它带有一个工厂,可以从服务器获取一系列问题: xoryApp.factory('questionService', function($http) { return { qdata : function(callback) { $http.get('/static/question.json').success(callback); } }; }); 然后我在控制器中调用此工厂,如下所示: questionService.qdata(fu

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

xoryApp.factory('questionService', function($http) {  
  return {
  qdata : function(callback) {
      $http.get('/static/question.json').success(callback);
  }
};
});
然后我在控制器中调用此工厂,如下所示:

questionService.qdata(function(results) {
    $scope.qdata = results;
});
然后,当我在问题中循环时,我在问题和回答部分观点之间来回切换。问题在于,每次加载问题视图时,它都会从服务器重新加载工厂json。但我希望它在加载应用程序时只执行一次,而不是每次加载使用该控制器的局部视图时都执行一次

你用什么方法来达到这个目的


谢谢

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

我提议这样做。也许这不是最好的,但效果很好

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

以下是几种可能的解决方案:

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

我希望它能有所帮助。

将服务器调用的结果缓存在服务方法中,您就可以开始了

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

  }

};
});

在函数中调用questionService.qdata?或者该代码放在控制器根目录中?它在控制器根目录中每次加载控制器时,它都会调用该函数,因为根代码将被执行。您需要将函数放入其中并有条件地调用。我现在为您创建一个plunker,5分钟=)