write - prevent angularjs




AngularJS-guardando datos entre rutas (2)

¿Cuál sería la mejor manera de guardar datos entre rutas?
Así que tengo un formulario que tiene 4 pasos y me gustaría que los datos de un paso anterior se transfirieran al siguiente paso.

En este momento, estoy usando un "servicio" para guardar los datos, que funciona. Sin embargo, el problema es que un "servicio" es singleton, navegar fuera del formulario y volver a él, tendrá todos los datos de un formulario anterior incompleto o abandonado.

¿Hay una buena manera de resolver este tipo de situación?

Gracias,
Tee


¿Por qué no mejora el servicio para eliminar los datos almacenados cuando:

  • El usuario no completa el formulario y se aleja del proceso completo de envío de formularios
  • El usuario envía el formulario.

Básicamente, podría mejorar su servicio de la siguiente manera:

myApp.factory('myService', function () {
    var formData = {};

    return {
        getData: function () {
            //You could also return specific attribute of the form data instead
            //of the entire data
            return formData;
        },
        setData: function (newFormData) {
            //You could also set specific attribute of the form data instead
            formData = newFormData
        },
        resetData: function () {
            //To be called when the data stored needs to be discarded
            formData = {};
        }
    };
});

Su controlador podría ser el siguiente:

myApp.controller('FirstStepCtrl', ['$scope', 'myService', function ($scope, myService) {
    //This is the controller of the first step in the form
    //Reset the data to discard the data of the previous form submission
    myService.resetData();

    //Remaining Logic here
}]);

myApp.controller('LastStepCtrl', ['$scope', 'myService', function ($scope, myService) {
    //This is the controller of the last step in the form

    //Submits the form
    $scope.submitForm = function () {
        //Code to submit the form

        //Reset the data before changing the route - assuming successful submission
        myService.resetData();

        //Change the route
    };

    //Remaining Logic here
}]);

Otra alternativa es llamar a la función resetData() del servicio cuando la ruta cambia a algo que no está dentro de la aplicación de formulario. Si tiene algo como un Controlador principal para los controladores de pasos de formulario, entonces en ese controlador, podría vigilar el cambio de ruta:

$scope.$on('$routeChangeStart', function() { 
   //Use $location.path() to get the current route and check if the route is within the 
   //form application. If it is, then ignore, else call myService.resetData()

   //This way, the data in the forms is still retained as long as the user is still
   //filling up the form. The moment the user moves away from the form submission process,
   //for example, when explicitly navigating away or when submitting the form, 
   //the data is lost and no longer available the next time the form is accessed
 });

Services persistirán a lo largo de la vida de sus aplicaciones. Así que no deberías tener ningún problema. Todo lo que necesita hacer es crear un Service e inyectarlo a los controladores que necesitan acceder a él. Por ejemplo, a continuación he inyectado el servicio de User a los controladores.

Simplemente use diferentes controladores para cada una de sus rutas para que su modelo dentro del alcance no se anule.

Primer controlador para primera ruta,

app.controller("FirstPageController", function($scope,User){   
    $scope.user = User;
    $scope.user.firstName  = "Emre";
    $scope.user.secondName = "Nevayeshirazi";
});

Segundo controlador para la segunda ruta,

app.controller("SecondPageController", function($scope,User){ 
    $scope.user = User;  
    $scope.user.age = 24;
});




angularjs