2017-01-21 6 views
1

ここでは多くの類似の問題について説明しましたが、私は関数を持っており、その中に$ http getリクエストを実行します。関数内で引数としてオブジェクトも渡します。応答が成功すると、正しいデータが表示され、私はそれを渡す外部変数に割り当てようとします。しかし、応答からのデータは機能の外で "逃げる"ようではありません。外部変数もスコープ変数です。私は直接関数を使用しません。なぜなら、関数は階層の下の他のコントローラによって使用されるはずだからです。 は、ここに機能だ:

$scope.user = {} //in the beginning of the controller. 
//..... 
$scope.getUser(1, $scope.user); 

をしているの$ scope.user後、まだ手つかずです:

$scope.getUser = function (userID, userData) { 
    var response = $http({ 
     method: "GET", 
     url: ("user/" + userID), 
     responseType: "json" 
    }) 
     .then(
     function (response) { //success 
      return response.data; 
     }, 
     function (response) { //error 
      alert(response.data.message); 
      return undefined; 
     }) 
      .then(function (data) { 
       userData = data; 
      }); 
}; 

は基本的に私はこのようなのuserDataに結果を代入しようとしています。 私もその中に入れてみました $を適用しますが、結果は同じです。 userData引数の代わりに$ scope.userを関数の中に置くと、すべてがOKですが、私が言ったように、関数の目的ではありません。どの変数でも動作できるはずです。私は角度uiルータを使用しており、この機能が配置されているコントローラは階層の最上位にあり、他のすべてのコントローラはそれにアクセスしてそれを使用してデータベースからユーザを取得する必要があります。

答えて

0

関数の入力パラメータを変更しても、関数の呼び出し元も更新されるとは限らず、適切なプログラミングパターンではありません。

必要なデータを更新するロジックを含む関数に更新代理人を渡すことを検討することがあります。例えば、ここに改訂されたのgetUser機能

$scope.getUser = function (userID, updateUserDataDelegate) { 
    var response = $http({ 
     method: "GET", 
     url: ("user/" + userID), 
     responseType: "json" 
    }).then(
     function (response) { //success 
      updateUserDataDelegate(response.data); 
     }, 
     function (response) { //error 
      alert(response.data.message); 
      return undefined; 
     } 
    ); 
}; 


$scope.user = {} //in the beginning of the controller. 

var updateScopeUserDelegate = function(userData) { $scope.user = userData; }; 
$scope.getUser(1, updateScopeUserDelegate); 
+0

を試してみてください!ありがとうたくさん:) – Stefan

1

は、あなたの質問に記載されたアプローチが有効なものではないと私は任意の$スコープの割り当てを作るためにあなたのコントローラの機能で結果を待つためにあなたを示唆しています。

は、これがうまく私のために働いた

$scope.getUser = function (userID) { 
    return $http({ 
     method: "GET", 
     url: ("user/" + userID), 
     responseType: "json" 
    }).then(function (results) { 
     return results.data; 
    });; 
} 

//and call it from your controller like 

$scope.getUser(1).then(function (data){ 
    //perform any data validations here 
    $scope.user = data; 
}); 
+0

申し訳ありませんが、役に立たなかった。これは実際に私がやったものとほぼ同じですが、関数の外で最後の "then"を移動しました – Stefan

+0

いいえ、これは同じではありません。私はコントローラからサービスに変数を渡しておらず、サービスが私たちに情報を返すのを待っています。そのデータによる操作は、サービスにないコントローラ内になければなりません。 –

+0

私は理解しています。しかしそれはまだ私にとってはうまくいきませんでした... @ Tianzhen Linによって提案された解決策が働いていました。 – Stefan

関連する問題