2016-05-06 10 views
0

Ich bin mit drei Angular-Controller:Der beste Weg, Variablen zwischen Steuerungen passieren

**Controller1** 

var fetchStudentDetails = function(){ 
    var sDetails = myService.getList(//url-1 here); 
    sDetails.then(function (data) { 
      $scope.studentData = data.list; 
      var studentId = $scope.studentData[0].id; 
    }); 
} 
fetchStudentDetails(); 
$scope.loadSecondLevel = function(){ 
       $state.go('secondLevel');    
       } 


**Controller2** 

    var fetchClassDetails = function(){ 
    var sDetails = myService.getList(//url-2 here); 
    sDetails.then(function (data) { 
      $scope.classData = data.list; 
      var className = $scope.classData[0].name; 
    }); 
    } 
    fetchClassDetails(); 
    $scope.loadThirdLevel = function(){ 
     $state.go('thirdLevel');     
    } 

**Controller3** 

    $scope.putStudentDetails = function(){ 
    // Here I need studentId,className for updateResource 
     var sDetails = myService.updateResource(//url-3 here); 
     sDetails.then(function (data) { 

     });  
    } 

Wo ich StudentID (in Controller1), classname (in Controller2) in eine Funktion, die in Controller3 passieren. Ich habe versucht mit $ rootScope, es funktioniert, aber beim Aktualisieren der Seite $ rootScope Werte werden leer. Weiß jemand, wie man das macht?

+6

Klingt wie Sie‘ re Suche nach [Dienste] (https://docs.angularjs.org/guide/services) – Ankh

+3

Wenn Sie Seite aktualisieren, werden die Daten offensichtlich gehen, das ist wie Single Page Applications (SPA) funktioniert. @Ankh hat Recht. Dienste können verwendet werden. Wenn Sie Daten persistieren möchten, können Sie SessionStorage oder LocalStorage des Browsers ausprobieren, aber das hat natürlich Einschränkungen –

+0

Wenn Sie die Seite aktualisieren, müssen Sie die Werte in [localStorage] speichern (https://developer.mozilla.org/en/docs/Web/API/Window/localStorage) und wie @Ankh kommentierte - Während der Laufzeit der App sollten Sie service/factory (oder beide) verwenden. –

Antwort

0

Je nachdem, welches Problem Sie lösen. Es gibt drei Optionen:

  1. ist, Daten zu $rootScope
  2. Ist zu speichern $scope.$emit & $scope.$on Funktionen zu nutzen.
  3. einen benutzerdefinierten Dienst Verwenden Sie die Daten

Und wenn Sie Daten müssen gespeichert speichern, so war es nach der vollständigen Seite neu laden verfügbar - localStorage.

+7

Die Verwendung von '$ rootScope' wird abgeraten und ist fast immer vermeidbar. – Seth

+2

Ich werde diese Antwort nicht ablehnen, weil Sie '$ rootScope' verwenden können, aber wie @Seth kommentierte - Sie sollten es vermeiden, es ist eine schlechte Praxis (Verwenden Sie stattdessen einen Dienst) –

1

Ihre Frage könnte in zwei Aspekte unterteilt werden:

1. Wie Daten zwischen den Controllern teilen
Die beste Vorgehensweise Daten in Angular 1.x zu teilen factory verwendet, speichern Sie die gemeinsam genutzten Daten in einem Fabrik-Service und Zugriffsmethoden an Steuerungen aussetzen:

factory('DetailData', function(myService, $q){ 

    var _details; 

    function __getDetailData(){ 
      return details 
    } 

    function __setDetailData(){ 
      return myService.getList().then(function(data){ 
       _details = data; 
      }) 
    } 

    return { 
     getDetailData: __getDetailData, 
     setDetailData: __setDetailData 
    } 

}) 


controller('myContrller', function(DetailData, $scope){ 
    $scope.data = DetailData.getDetailData(); 
}) 

2. Wie Daten bestehen bleiben, wenn die Seite aktualisiert,
können Sie localStorage verwenden, um Daten während Seite Nachladen persistent zu halten, können viele Tools & Bibliotheken dies zu erreichen, zum Beispiel ngStorage, oder die Daten vom Server jedes Mal Ihre Winkel Anwendung gestartet zurücksetzen konnte:

//this would register work which would be performed 
//when app finish loading and ready to start. 
angular.module('app').run(function(DetailData){ 

    DetailData.setDetailData(); 

}) 
Verwandte Themen