AngularJS - 在路由之间保存数据
问题的原因是在不同的路由之间保存数据时出现了覆盖的问题。解决方法是使用服务(Service)来持久保存数据,并将服务注入到需要访问数据的控制器中。
在第一个路由的控制器中,将User服务注入并在$scope中创建一个user对象来保存数据。
app.controller("FirstPageController", function($scope,User){ $scope.user = User; $scope.user.firstName = "Emre"; $scope.user.secondName = "Nevayeshirazi"; });
在第二个路由的控制器中,同样将User服务注入并在$scope中使用user对象保存数据。
app.controller("SecondPageController", function($scope,User){ $scope.user = User; $scope.user.age = 24; });
上述解决方法是一个较差的解决方案,因为当用户尝试填写表单时,表单通常不会包含任何数据。根据问题的描述,当一个用户填写了一个表单,提交表单后再返回填写同一个表单时,用户不应该看到旧的表单数据。解决方案建议为表单字段设置默认值,而这不是用户在这种情况下所期望的。
另外,为什么要在控制器中直接调用服务并覆盖数据,而不是从视图中映射数据呢?这不是一个好的做法。
问题的出现原因是用户在表单提交过程中可能会导航离开页面,或者提交表单后。为了解决这个问题,可以通过增强服务来处理删除存储的数据。服务可以包含三个方法:getData、setData和resetData。其中,getData方法用于获取数据,setData方法用于设置数据,resetData方法用于重置数据。控制器根据需要调用这些方法来处理数据。另一种解决方法是在路由改变时调用resetData方法,以确保数据不会被保留在下次访问表单时。这可以通过在父控制器中监听路由变化来实现。
具体的实现代码如下:
myApp.factory('myService', function () { var formData = {}; return { getData: function () { return formData; }, setData: function (newFormData) { formData = newFormData; }, resetData: function () { formData = {}; } }; }); myApp.controller('FirstStepCtrl', ['$scope', 'myService', function ($scope, myService) { myService.resetData(); // 剩余逻辑 }]); myApp.controller('LastStepCtrl', ['$scope', 'myService', function ($scope, myService) { $scope.submitForm = function () { // 提交表单的代码 myService.resetData(); // 改变路由 }; // 剩余逻辑 }]); $scope.$on('$routeChangeStart', function() { // 使用$location.path()获取当前路由,并检查是否在表单应用程序内。如果是,则忽略;否则调用myService.resetData()。 // 这样,只要用户填写表单,表单中的数据就会保留。一旦用户离开表单提交过程,例如显式导航或提交表单,数据就会丢失,下次访问表单时将不再可用。 });
以上就是解决问题的原因和解决方法的整理。