我是AngularJS的新手。我有下面的场景
菜单项-主页2页面3页面4
请记住, 主页具有HomeController
Page2具有Page2Controller
Page3具有Page3Controller
Page4具有Page4Controller
每个页面都有其自己的init()函数,用于从服务器获取数据并填充初始数据。
一开始,我必须为每个页面调用不同的过程以为每个页面填充不同的值。
现在我的问题如下:
步骤1: 我已经登录到应用程序,并填充了“主页”值。
步骤2: 我单击了Page2以获取初始数据。
Page3和Page4也是如此。
此时,所有页面都具有初始值。
第3步:
现在,我想返回首页(例如,单击“主页”)。
有什么方法可以检查主页的值吗?
如果主页上有值,我不想调用Init()函数。
是否可以不调用Init()函数?
这个想法是,如果我在第一次调用后不必调用Init()函数,则应用程序会更快。
非常感谢您在这方面的投入。
谢谢
答案 0 :(得分:-1)
初始化此类数据不是最佳方法。 在这种情况下,您应该使用工厂维修服务。。
例如,让我们创建homeService
并定义一个类似init
的方法,如果该数据不存在,您将在其中生成数据并将其存储在变量中,下次将该方法称为返回变量而不是生成再来一次...
function init () {
if (initVariable) {
return initVariable;
} else {
// generate init data somehow and save it
initVariable = generateInitData();
return initVariable;
}
}
angularjs中的服务是单例,因此即使您更改页面,也不会丢失initVariable
。因此,在控制器init函数中应该做的只是调用此方法。
$ctrl.$onInit = function () {
$ctrl.initialData = homeService.init();
}
编辑
发送当前代码后,我进行了一些更改以实现我告诉您的概念。只需查看评论
// define global service variable inside service
var allInitData = null;
var getAllInitData = function () {
var deferred = $q.defer();
// check if we fetched allInitData already
if (allInitData) {
$timeout(function(){
deferred.resolve(allInitData);
});
} else {
$http.get(baseUrl + "GetInitDataAll")
.then(function (result) {
// you need to store your result in variable in service
allInitData = result;
deferred.resolve(result);
},
function (result) {
deferred.reject(result);
});
return deferred.promise;
};