2013-05-28 12 views
23

Jaki byłby najlepszy sposób na zapisywanie danych między trasami?
Mam więc formularz, który składa się z 4 kroków i chciałbym, aby dane z poprzedniego kroku zostały przeniesione do następnego kroku.AngularJS - zapisywanie danych między trasami

W tej chwili używam "usługi" do zapisywania danych, która działa. Jednak problem polega na tym, że "usługa" jest pojedyncza, odejście od formy i wracając do niej, nadal będzie zawierała wszystkie dane z poprzedniej, niekompletnej lub porzuconej formy.

Czy istnieje dobry sposób rozwiązania tego rodzaju sytuacji?

Dziękuję
Tee

+1

możliwym duplikatu [angularjs, przechodząc zakres pomiędzy drogami] (http://stackoverflow.com/questions/13882077/angularjs-passing-scope-between-routes) –

Odpowiedz

2

Services będzie utrzymywać się przez całe życie swoich aplikacjach męska. Nie powinieneś mieć żadnych problemów. Wszystko, co musisz zrobić, to stworzyć numer Service i wprowadzić go do kontrolerów, które muszą uzyskać do niego dostęp. Na przykład poniżej wprowadziłem usługę User do kontrolerów.

Po prostu użyj różnych kontrolerów dla każdej z tras, aby wewnętrzny model nie został nadpisany.

Pierwszy kontroler dla pierwszej trasy,

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

Drugi kontroler do drugiej drogi,

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

To byłoby złe rozwiązanie. Formularze zwykle nie zawierają danych, gdy użytkownik próbuje je wypełnić. Zgodnie z pytaniem, kiedy użytkownik wypełnia formularz, przesyła formularz, a następnie wraca, aby ponownie wypełnić ten sam formularz, użytkownik nie powinien otrzymywać starych danych formularza. Twoje rozwiązanie proponuje domyślne wartości pól formularza, które nie są tym, czego użytkownik oczekuje tutaj. – callmekatootie

+0

Ponadto, dlaczego wywołać usługę, gdy planujesz przesłonić dane w kontroler bezpośrednio, zamiast mapowania danych z widoku? – callmekatootie

29

Dlaczego nie można poprawić obsługę, aby zadbać o usunięcie przechowywanych danych, gdy:

  • Użytkownik nie wypełnia formularza i przechodzi poza cały proces przesyłania formularzy
  • Użytkownik przesyła formularz

Zasadniczo, można zwiększyć swoje usługi w następujący sposób:

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 = {}; 
     } 
    }; 
}); 

Kontroler może następnie być następująca:

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 
}]); 

Inną alternatywą jest wywołaj funkcję usługi resetData(), gdy trasa zmieni się w coś, co nie znajduje się w aplikacji formularza. Jeśli masz coś takiego kontrolera dominującą wobec kontrolerów kroku formularz, a następnie w tym kontrolerze, można trzymać pieczę nad zmianą trasy:

$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 
}); 
+0

Dzięki @callmekatootie. Tak, mam teraz funkcję resetData.Po prostu czuję, że jest trochę hacky, że muszę śledzić ścieżki. Myślę, że kątowe byłoby w stanie wykonać podwójne wstawianie szablonów, tj. Jeśli masz kontroler w tagu HTML, to działa on niezależnie od trasy. Tak więc w tym przypadku mam kontroler nadrzędny, który nie zostanie przeładowany po zmianie trasy, ale ma również kontroler podrzędny dla każdego z kroków. Po prostu nie wiem, czy to możliwe. – teepusink

Powiązane problemy