2016-10-31 6 views
0

Ich habe eine Indexseite index.html mit seinem Controller indexController. Ich habe einen Wert ($ scope.ipAddress) in einem factory in der indexController gesetzt, die von anderen Controllern des html innerhalb ng-view verwendet wird.Führe einen Controller aus, nachdem der Hauptcontroller ausgeführt wurde

Wenn die Seite geladen wird, wird der erste indexController ausführen soll, auf einen Wert in der factory und dann wird dieser Wert durch andere Steuerungen von Seiten innerhalb ng-view verwendet.

Aber ich denke, die anderen Controller werden zuerst vor indexController ausgeführt und ich bekomme undefiniert für den Wert ich gesetzt.

Dies ist indexController mit factory:

 angular.module('tollApp') 
.controller('indexController', function($scope,$http,$window,userDetailsFactory){ 
    $scope.usernameFromServer={}; 
    $scope.getUserDetails = function(){ 
     $http({ 
      method:'GET', 
      url:'http://192.168.1.80:4000/getUserDetails' 
      // url:'http://websitename.com/getUserDetails' 
     }) 
     .then(function(response){ 

      // console.log(JSON.stringify(response)); 
      userDetailsFactory.setUserDetailsInFactory(response.data); 
     $scope.usernameFromFactory = userDetailsFactory.getUserDetailsFromFactory().usernameFromSession; 
     $scope.theIP = userDetailsFactory.getUserDetailsFromFactory().ipAddress; 
      // $scope.usernameFromServer = userDetailsFactory.getUserDetailsFromFactory().username; 
      // console.log(JSON.stringify($scope.usernameFromFactory)+"usernameFromFactory"); 
     }) 
    } 
    $scope.logout = function(request,response){ 
     $http({ 
      method:'GET', 
      url:'/logout' 
     }) 
     .then(function(response){ 
      console.log(JSON.stringify(response)); 
      if(response.data=="logout"){ 
       // $window.location.href="http://websitename.comlogin"; 
       $window.location.href="http://192.168.1.80:4000/login"; 

      } 
     }) 
    } 
    console.log("indexController"); 
}).factory('userDetailsFactory',function(){ 
    var user = {}; 
    return { 
     setUserDetailsInFactory : function(val){ 
      user.useridFromSession = val[0].UserID; 
      user.usernameFromSession = val[0].UserName; 
      user.userroleFromSession = val[0].UserRole; 
      user.clientidFromSession = val[0].ClientID; 
      user.ipAddress = "http://192.168.1.80:4000/"; 
      // user.ipAddress = "http://websitename.com/"; 
      // console.log("in set "+user.clientidFromSession); 
     }, 
     getUserDetailsFromFactory : function(){ 
      return user; 
     } 
    }; 
}) 

Der andere Controller, wo ich den Wert von der Fabrik verwendet werden:

$scope.ipForHttp = userDetailsFactory.getUserDetailsFromFactory().ipAddress; 
console.log($scope.ipForHttp); //undefined 
$scope.loading = false; 
$scope.ClientID = userDetailsFactory.getUserDetailsFromFactory().clientidFromSession; 
// $scope.dev={}; 

$scope.getDevice =function(){ 
    console.log($scope.ipForHttp); //undefined 
    $scope.loading = true; 

     $http({ 
     method : "GET", 
     url : $scope.ipForHttp+"getDeviceDetailsReport" 
     }).then(function mySucces(response) { 

Antwort

1

einen Blick auf Ihre $scope.getUserDetails Take - Sie verwenden $http (docs) einen asynchronen AJAX-Aufruf an das Backend zu tätigen.

Die Callback-Funktion, die Sie in der -Methode des zurückgegebenen Objekts bereitstellen, kann irgendwann in der Zukunft ausgeführt werden oder auch nicht - hängt davon ab, ob der Aufruf erfolgreich ist oder fehlschlägt. Sie dürfen nicht erwarten, dass es sich synchron verhält, denn das wird es nie tun, auch wenn das Backend sofort reagiert.

Deshalb können Sie nicht erwarten, die gewünschten Daten in Ihren anderen Controllern zu haben und müssen Ihren Code entsprechend anpassen, z.

// tells angular to execute watcher function on every $digest 
$scope.$watch(function() { 
    // watches the returned value of the service's method 
    return userDetailsFactory.getUserDetailsFromFactory(); 
}, function (newVal) { 
    // filtering out empty object 
    if (!Object.keys(newVal).length) { 
     return; 
    } 

    // the following code will be run when 
    // userDetailsFactory.getUserDetailsFromFactory 
    // returns some value 
    // in our particular case - after getting 
    // data from backend and setting it in 
    // userDetailsFactory.setUserDetailsFromFactory 

    $scope.loading = false; 
    $scope.ipForHttp = newVal.ipAddress; 
    $scope.ClientID = newVal.clientidFromSession; 

    $scope.getDevice(); 
}, 
// tells angular to watch properties of the object too 
true); 

Optional, wenn Sie nur einmal diesen Code ausführen müssen, wenn Benutzerdaten gesetzt sind, tun dies

var unbindUserDetailsWatcher = $scope.$watch(function() { 
    return userDetailsFactory.getUserDetailsFromFactory(); 
}, function (newVal) { 
    if (!Object.keys(newVal).length) { 
     return; 
    } 

    unbindUserDetailsWatcher(); 
    unbindUserDetailsWatcher = null; 

    ... 
}); 
+0

OP, gibt es eine viel bessere Möglichkeit, diese Aufgabe zu lösen - mit Service und Promises ([$ q] (https://docs.angularjs.org/api/ng/service/$q) um genau zu sein). Sie sollten sich die Dokumente und Beispiele ansehen und versuchen, es selbst herauszufinden. Tipp - Der Code, der mehrere abhängige Elemente enthält, sollte auf den Server verschoben werden. Wenn Sie Hilfe brauchen - einfach kommentieren und ich zeige Ihnen die richtige Lösung. –

+0

Es ist der Code, der an den "anderen Controller" gehen soll, ich werde dem Code Kommentare hinzufügen, um es Ihnen leichter zu machen, –

+0

zu verstehen. Der 'newValue' ist leer, wenn ich' console.log() '. Es ist '{}'. Ich habe ein 'Zeitlimit 'auf' indeController 'gesetzt (Controller, wo ich den Wert in der Fabrik festlege). so dass es mein oben angegebenes Problem simuliert, das nur auftritt, wenn ich hosten. Wenn ich das 'Timeout' entferne, bekomme ich alle Werte. – Abhi

Verwandte Themen