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分钟=)