2016-10-31 1 views
0

コントローラがindexControllerのインデックスページindex.htmlがあります。私はng-viewのhtmlの他のコントローラで使用されているindexControllerfactoryに値($ scope.ipAddress)を設定しました。メインコントローラの実行後にコントローラを実行する

ページがロードされると、最初にindexControllerが実行され、factoryに値が設定され、その値がng-viewのページの他のコントローラによって使用されます。

しかし、私は他のコントローラがindexControllerの前に最初に実行され、設定した値が未定義になると思います。

これはfactoryindexController次のとおりです。

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

私は工場からの値を使用し、他のコントローラ:

$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) { 

答えて

1

は、あなたの$scope.getUserDetailsを見てください - あなたは$httpdocsを使用しています)サービスを使用してバックエンドへの非同期AJAX呼び出しを行います。

返されたオブジェクトの.then()メソッドで指定したコールバック関数は、いつかは将来実行されても、呼び出しが成功するか失敗するかによって異なる場合があります。バックエンドが即座に応答したとしても、それは決してできないので、それが同期的に振る舞うと期待してはいけません。

これは、他のコントローラに必要なデータがあると予想できず、それに応じてコードを調整する必要があるからです。サービスとの約束を使用して( -

// 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); 

オプションで、一度だけ、ユーザーの詳細が設定されている場合、そのコードを実行する必要がある場合は、このタスクを解決するためのより良い方法がある、この

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

    unbindUserDetailsWatcher(); 
    unbindUserDetailsWatcher = null; 

    ... 
}); 
+0

OPを行います[$ q](正確にはhttps://docs.angularjs.org/api/ng/service/$q)。あなたは、ドキュメントとサンプルを見て、自分でそれを理解しようとする必要があります。ヒント - 複数の扶養家族を持つコードをサーバーに移動する必要があります。あなたはそれについて助けが必要な場合 - ちょうどコメントと私はあなたに正しい解決策を案内します。 –

+0

「他のコントローラ」に行く​​コードです。わかりやすくするためにコードにコメントを追加します。 –

+0

'newValue'は' console.log() 'のときに空です。それは '{}'です。私は 'indeController'(私が工場で値を設定したコントローラ)に' timeout'を設定しました。私はホストしているときにのみ発生する上記の私の問題をシミュレートするように。 'timeout'を削除すると、すべての値が取得されます。 – Abhi

関連する問題