2013-10-29 37 views
2

我有一个工厂,获取从服务器的问题清单测验类型的应用程序: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。但我希望它只在加载应用程序时执行,而不是每次加载使用该控制器的部分视图。

你在角度上实现的方式是什么?

谢谢

+0

呼叫questionService.qdata一个函数里?或者这个代码放在控制器根目录下? –

+0

它在控制器的根部 – bwbrowning

+0

每次加载控制器时,都会调用此函数,因为根代码将被执行。你需要放入一个函数并有条件地调用。我现在会为你创造一个蹲点,5分钟=) –

回答

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

我希望它能帮助。

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

    } 

}; 
});