2016-07-20 10 views
0

選択リストとテキストボックスからなる行の表を持つ角度表示があります。選択リストのインデックスが変更されると、同じ行の対応するテキストボックスをデータベースの参照値で更新する必要があります。私は、$ http.getを利用してActionMethodを通して呼び出しを行う$ scope関数を呼び出すために、選択リストでng-Changeを使用しています。私はこれを何百万という方法で試してみましたが、最後に$ http.get関数からスコープ変数に値を割り当てることで値を抽出できましたが、選択したインデックスの変更によってトリガされた前回のルックアップの値を取得するだけです。現在のものではありません。どのようにしてリアルタイムで価値を得ることができますか?私はそれが非同期であることを理解しているので、問題の性質を知っています。どのように私はそれを回避するのですか?私の.jsの現在の状態:

$scope.EntityId = null; 
$scope.EntityNameChanged = function (item, block) { 
    for (var i = 0; i < block.length; i++) 
    { 
     if (item.Value == block[i].Name.Value) { 
      $scope.GetEntityId(item.Value); 
      block[i].Id = $scope.EntityId; 
     } 
    } 
} 
$scope.GetEntityId = function(name) { 
    $http.get("EntityId", { params: { EntityName: name } }).then(function success(response) { 
     $scope.EntityId = response.data[0].Value; 
    }); 
}; 
+0

可能な重複http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchronous-call) –

答えて

0

GetEntityID機能は、次にforループでIIFEを使用約束

function GetEntityId(name) { 
    //save httpPromise 
    var p = $http.get("EntityId", { params: { EntityName: name } }); 

    //return derived promise 
    return p.then(function onSuccess(response) { 
     //return chained data 
     return response.data[0].Value; 
    }); 
}; 

を返す必要があります。

$scope.EntityNameChanged = function (item, block) { 
    for (var i = 0; i < block.length; i++) { 
     //USE IIFE to hold value of i 
     (function IIFE(i) { 
      if (item.Value == block[i].Name.Value) { 
       //save promise 
       var p = GetEntityId(item.Value); 
       //extract value from promise 
       p.then(function onSuccess(Value) { 
        block[i].Id = Value; 
       }); 
      } 
     })(i); 
    } 
} 

forループが完了した後onSuccess関数が非同期的に呼び出されるので、生命維持の閉鎖は、データがサーバーから返された後までiの値を保存する必要があります。


[私は非同期呼び出しからの応答を返すにはどうしますか?](の
+0

あなたは目に見えないミサイルの男です!あなたはそれを持っています!ありがとうございます:D –

0

割り当て後$scope.apply()を呼び出して、その$腕時計ループ上の範囲の値を更新するために、角度プロンプトに。これにより、最新の値になるはずです。

EDIT:この回答は間違っていました。それはすでに$ applyを使用している$ http取得リクエストでした。 あなたがする必要があるのは、要求を工場内に置き、約束を返すことです。あなたのコントローラに工場が必要です。

app.factory('getData', function ($http, $q){ 

    this.getlist = function(){    
     return $http.get('mylink', options) 
      .then(function(response) { 
       return response.data.itemsToReturn; 
      });    
    } 
    return this; 
}); 

app.controller('myCtrl', function ($scope, getData){ 
    app.getData() 
     .then(function(bar){ 
     $scope.foo = bar; 
     }); 
}); 
+0

お返事ありがとうございます。 $ scope.apply()は無効ですが、$ scope。$ apply()は無効です。しかし、これは$ rootscopeエラーのカスケードを作成しました。 –

+0

申し訳ありませんが、私の悪い。私はいくつかのコードで編集します – gcoreb

0

GetEntityId機能は、非同期要求を行っても非同期ではありません。 $scope.EntityIdを設定するまでに、forループは既に終了しています。

他の反復で設定できるループ外の値を共有しようとしているので、このように非同期呼び出しを実際にキューに入れることはできません。したがって、ループ内の1つのアイテムが別のアイテムの戻り値値。

代わりに、約束をループに戻して、ループ内で.thenを実行する必要があります。以下のような何か:

$scope.EntityNameChanged = function(item, block) { 
    for (var i = 0; i < block.length; i++) { 
    if (item.Value == block[i].Name.Value) { 
     $scope.GetEntityId(item.Value) 
     .then(function success(response) { 
      block[i].Id = response.data[0].Value; 
     }); 
    } 
    } 
} 
$scope.GetEntityId = function(name) { 
    return $http.get("EntityId", { 
    params: { 
     EntityName: name 
    } 
    }); 
}; 

(これは未テストですが、あなたが期待する何をすべき注意してください)。

+0

あなたの返信をありがとうございました。これは私が最初に持っていたものと似ていますが、このメソッドを試してみると同じ問題が発生します: "未定義のプロパティ 'Id'を設定できません。ブロックは$ http.get関数内で利用できません。 –

+0

hmm、' block '.then'がループの中にあれば' '.then'で確実に利用できるはずです;後でテスト可能なサンプルを作成することができます。 – Claies

関連する問題