2

API値を取得するためにコントローラーを呼び出しています。$http メソッドの外で配列を渡すにはどうすればよいですか?

に配列 を渡す必要がありpa[]ます$scope.myData = pa;

まず、console.log(pa) は値 [10,20,30,40] を出力します。

次に、console.log(pa) は array[] を空にします。

JavaScript

function Ctrl($scope, $http) {
    var url = "https://spreadsheets.google.com/feeds/list/0AsXjbsnPIu06dGswZUV4WX/values?alt=json-in-script&callback=angular.callbacks._0";
    var pa = [];
    $http({
        method: 'JSONP',
        url: url
    }).success(function (data) {

        for (i = 0; i < data.feed.entry.length; i++) {
            var entry = data.feed.entry[i];
            pa.push(entry.gsx$productivity.$t);
            console.log(pa); //[10,20,30,40,50]
        }
    });

    console.log(pa) // [] empty array

    $scope.myData = pa;
}

$success コールバック関数の外で配列を取得するにはどうすればよいですか?

4

3 に答える 3

3

このコードは非同期です。サービスが API 呼び出しから値を取得する前にpa割り当てられます。$scope.myData$http

$qコードのフローを制御するには、サービス プロミス ライブラリを使用する必要があります。このようなもの:

function Ctrl($scope, $http, $q) {
  var url = "https://spreadsheets.google.com/feeds/list/0AsXjbsnPIu06dGswZUV4WX/values?alt=json-in-script&callback=angular.callbacks._0";
  var pa = [];
  var paPromise = $q.defer()

  $http({
    method: 'JSONP',
    url: url
  }).success(function(data) {

      for (i = 0; i < data.feed.entry.length; i++) {
        var entry = data.feed.entry[i];
        pa.push(entry.gsx$productivity.$t);
        console.log(pa); //[10,20,30,40,50]
      }
      paPromise.resolve(pa)
    });

  $scope.myData = paPromise.promise;
}

ここでは、$qサービスを注入し、それを使用して変数をインスタンス化しますpaPromise。次に、この約束を に与え$scope.myDataます。約束が$http成功メソッド内で解決されると、AngularJS は値を通知して$scope更新し、テンプレート/DOM に反映されます。

于 2013-11-06T12:18:34.573 に答える
0

これは本当にあまり意味がありません。次のようになります。

$scope.myData = [];
$http({
    method: 'JSONP',
    url: url
}).success(function (data) {

    for (i = 0; i < data.feed.entry.length; i++) {
        var entry = data.feed.entry[i];
        $scope.myData.push(entry.gsx$productivity.$t);
        console.log(pa); //[10,20,30,40,50]
    }
});

はコントローラー関数の内部で設定されているため、それを宣言してからequal にpa設定する必要はありません。それはただトラブルを求めているだけです。$scope.myDatapa

于 2013-11-06T12:17:16.490 に答える