我有一个测验类型的应用程序,其工厂可以从服务器获取问题列表:
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 :(得分: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);
}
};
});
我希望它有所帮助。