2017-02-05 1 views
1

属性を指定してrootscope関数を作成しました。 dbからデータを取得しています。rootscopeで関数をスコープで返すようにする

コントローラでこのrootscope関数を使用して、データを変数に入れたいと思っています。

$rootScope.get_option = function(option_name){ 
     $http.post("server/read.php",{'subject': "options", "args": option_name }) 
     .success(function (response) { 
      console.log(response); 
      $rootScope.option_get_value = response; 

     }); 

     if($rootScope.option_get_value){ 
      return $rootScope.option_get_value; 
     } 

    } 

そして、この私が、コントローラに持っているもの

$scope.subscription.reduced_hourrate = $rootScope.get_option('verlaagd_tarief'); 
    console.log($scope.subscription.reduced_hourrate); 

私はスクリプトを実行すると、私は戻って私に正しい値を与えるログの$ rootScope機能でご覧ください。しかし、範囲は私に未定義のデータを返す。

どうしてですか?誰かが私にいくつかのヒントを教えてくれますか?

+0

'$ http'' success() 'メソッドを使わないでください。 '.then'を使用してください –

答えて

0

$httpは、非同期呼び出しを行います。つまり、http成功関数が解決される前にifステートメントif($rootScope.option_get_value) ...が呼び出されたことを意味します。

それはあなたがあなたのコントローラ内で次にそれを

$rootScope.get_option('verlaagd_tarief').success(function (response) { 
    $rootScope.option_get_value = response; 
}); 

$rootScope.get_option = function(option_name){ 
    return $http.post("server/read.php",{'subject': "options", "args": option_name }) 
} 

をこの方法を行うことができます動作させるためにしかし、私は、これは、コントローラにデータを渡すための最良の方法であるか分かりません。 一般的な方法はservicesです。使用しない場合$rootScope

ここでは、サービスを使用してコントローラにデータを渡す方法の例を示します。あなたは$ http.postのために呼び出すと

var app = angular.module('myApp', []); 

//declare a service that make the http calls 
myApp.factory('myHttpService', function($scope, $http) { 

    //return the public API 
    return { 
     //use a callback function to return 
     //the result when the promise is resolved 
     get_option : function(option_name, fct){ 
      $http.post("server/read.php", 
       { 
         "subject": "options", 
         "args": option_name 
       } 
      ).then(function(result){ 
       fct(result) //calling the callback when the promise is resolved to return the result 
      }) 
    } 
}); 

// the controller using myHttpService 
myApp.controller('myCtrl', function($scope, myHttpService) { 
    myHttpService.getOption('verlaagd_tarief', function(result){ 
     $scope.option_get_value = result 
    }) 
}); 
+0

最初の答えでPromiseを使用する理由は何ですか? –

+0

2番目の例では、 'then'関数の中で呼び出されるコールバック関数を使用します。通常は' .success'を '.then'で置き換えます。 '.then'では' result.data'を返す必要はありませんが、 'result'だけがこの違いを理解するための記事を参照してくださいhttp://stackoverflow.com/questions/16385278/angular-httppromise-difference-between-success -error-methods-and-thens-a – Merlin

+0

これは電車のように働く素晴らしい人です! –

1
$rootScope.get_option = function(option_name){ 
    return $http.post("server/read.php",{'subject': "options", "args": option_name }) 
    .success(function (response) { 
     console.log(response); 
     if(response){ 
      return response; 
     } 
    }); 
} 

、成功はしばらくの間を返す行が呼び出された場合、応答が戻ってこなかったことをので、あなたが、「未定義」になっている理由、それはだ後$ rootScope.option_get_valueを満たすデータがあります。 応答が利用可能になったときにのみ起動される約束に戻り、 ".success"($ http:https://docs.angularjs.org/api/ng/service/ $ httpの約束)、 を使用しています。

コンソールでは、コンソールが参照によって動作しているため、応答の完全なデータが表示されます。つまり、ログをクリックしてobjを開くと、戻り値は既に戻ってきて、データをコンソールに送信します。

+0

あなたの '返信応答 'はどこにも使用できません。 –

+0

右、ありがとう '私はそれを編集しました – David

関連する問題