-1

次のように、いくつかのソースからAngularJSコントローラーにデータを読み込もうとしています-

var Controller = function ($scope, $http) {
    var load = {
        somekey: "/data/a.json",
        someotherkey: "/data/b.json",
        yetanotherkey: "http://restapi"
    }
    for (var i in load) {
        $http({
            url: load[i],
            method: 'GET'
        }).success(function (data, status, headers, config) {
            $scope[i] = data; // <<---- this does not point to the right value of i
        }).error(function (data, status, headers, config){
            $scope[i] = "Error getting content for " + i;
        });
    }
}

iただし、コールバックがまだ実行されている間に変数の内容がループ内で変更されるため (つまり、辞書内のすべての値をループするのにかかる時間内に HTTP 要求が終了しないため)、このコードは機能していないようです。の最後の値iが更新され、他のすべての値は使用されません。

この問題を回避するにはどうすればよいですか?

4

2 に答える 2

1

ループを書く正しい方法は-だったと思います

Object.keys(load).forEach(function (element, index, array) {
    $http({
        url: load[element],
        method: 'GET'
    }).success(function (data, status, headers, config) {
        $scope[element] = data;
    }).error(function (data, status, headers, config){
        $scope[element] = "Error getting content for " + i;
    });
});
于 2013-02-20T17:55:40.897 に答える
0

または、もちろん、自分で簡単なクロージャーを作成します。

for (var item in load) {
    (function(i) {
        $http({
            url: load[i],
            method: 'GET'
        }).success(function (data, status, headers, config) {
            $scope[i] = data; // <<---- this does not point to the right value of i
        }).error(function (data, status, headers, config){
            $scope[i] = "Error getting content for " + i;
        });
    })(item);
}
于 2014-07-22T10:37:49.923 に答える