如何在点击返回按钮时保留我的数据?

12 浏览
0 Comments

如何在点击返回按钮时保留我的数据?

当reloadOnSearch被设置为false时,通过浏览器的返回按钮点击来触发API调用。由于我将reloadOnSearch设置为false,所以我使用$routeUpdate来识别浏览器的返回按钮点击。目前,当触发$routeUpdate时,我重新加载页面。但是这个重新加载会导致我存储的所有API调用响应数据的丢失。有没有办法防止这种数据丢失?

我在网站上显示一个带有分页的数据列表。每当用户更改页面时,都会触发一个函数来检查数据是否已经获取。如果没有,就会进行API调用来获取数据。

由于我将reloadOnSearch设置为false,所以点击浏览器的返回按钮只会改变URL而不是视图。在这种情况下,我使用$routeUpdate。当触发$routeUpdate时,我首先检查这是由于分页点击还是返回按钮点击。如果是分页点击,就执行正常的API调用。但是如果是返回按钮点击,我重新加载页面。但这会导致之前获取的所有响应数据丢失,我希望避免这种情况。

一个明显的解决方案是在$routeUpdate的回调函数中调用API调用函数。但是问题是我的网站有多个数据列表,我希望避免在app.run()中编写多个条件和函数调用。有没有办法在点击返回按钮时保留我的数据?

以下代码片段位于app.run()中:

$rootScope.$on('$routeUpdate', function(event, next){

console.log("route update fired");

// 这会给我URL中的参数(例如页码)

let params = JSON.stringify(next.params);

console.log(params); // 例如 {listTransactionsPage: 2}

// 现在我将把这个与控制器中保存的$rootScope值进行比较(更多细节请参见下面的代码)。

if(params !== JSON.stringify($rootScope.listCurrentParams))){

console.log("back/forward button clicked.");

$route.reload();

}

else{

console.log("route changed via pagination");

}

});

以下代码片段位于app.controller()中:

app.controller('listTransCtrl', ['$scope', '$location', '$window', '$rootScope', function($scope, $location, $window, $rootScope){

console.log("Inside listTransCtrl.");

$rootScope.listCurrentParams = {};

// 当分页按钮被点击时调用的函数...

$scope.listTransPageChanged = function(pageNum){

console.log(pageNum);

$location.search('listTransactionsPage', pageNum);

$rootScope.listCurrentParams = $location.search();

console.log($rootScope.listCurrentParams);

// 执行API调用

$scope.getAllTransFunc();

}

}]);

0
0 Comments

问题的原因是在点击返回按钮时,数据可能会丢失。为了解决这个问题,作者使用了一个建议的解决方案。之前,作者将所有的API调用响应数据存储在控制器的$scope中。但是通过将这些数据存储在一个服务中,作者成功地防止了在$route.reload()期间数据的丢失。如果想要了解如何在服务中存储数据的方法,请访问下面的链接:Angularjs Best Practice for Data Store

0