AngularJS - 在路由之间保存数据

20 浏览
0 Comments

AngularJS - 在路由之间保存数据

在路由之间保存数据的最佳方式是什么?我有一个有4个步骤的表单,我希望前一步的数据能够传递到下一步。目前,我正在使用一个“服务”来保存数据,这个方法可以工作。然而,问题是由于“服务”是单例的,导航离开表单并返回时,仍然会保留所有来自之前未完成或放弃的表单的数据。有没有解决这种情况的好方法呢?谢谢,Tee

0
0 Comments

问题的原因是在不同的路由之间保存数据时出现了覆盖的问题。解决方法是使用服务(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;
});

上述解决方法是一个较差的解决方案,因为当用户尝试填写表单时,表单通常不会包含任何数据。根据问题的描述,当一个用户填写了一个表单,提交表单后再返回填写同一个表单时,用户不应该看到旧的表单数据。解决方案建议为表单字段设置默认值,而这不是用户在这种情况下所期望的。

另外,为什么要在控制器中直接调用服务并覆盖数据,而不是从视图中映射数据呢?这不是一个好的做法。

0
0 Comments

问题的出现原因是用户在表单提交过程中可能会导航离开页面,或者提交表单后。为了解决这个问题,可以通过增强服务来处理删除存储的数据。服务可以包含三个方法: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()。
    // 这样,只要用户填写表单,表单中的数据就会保留。一旦用户离开表单提交过程,例如显式导航或提交表单,数据就会丢失,下次访问表单时将不再可用。
});

以上就是解决问题的原因和解决方法的整理。

0