0

$resource オブジェクトを返す WebService という AngularJS のファクトリがあります。

angular.module('cstarsServices')
.factory('WebService', function ($resource)
{
    return $resource("some_url_here/:op1/:op2/:op3/:op4",
            {op1: 'indexes'},
            {
                getIndexes: {
                    isArray: true,
                    method: 'GET'
                }

            }
        );
});

コントローラーの 1 つで、getIndexes を呼び出します。

WebService.getIndexes(function(data){

    // SearchIndex Table
    $scope.languages = [];
    var languages = [];
    var ajaxResponse = [];


    angular.forEach(data, function (item, i)
    {
        if (item.sourceTypes != null)
        {
            ajaxResponse.push({ selected: false, name: item.name, languages: item.sourceTypes[0] });
            languages[item.sourceTypes[0]] = item.sourceTypes[0];
        }
    });
    $scope.searchIndexes = ajaxResponse;


    for (var key in languages)
    {
        $scope.languages.push(languages[key]);
    }
    $scope.language = languages[0];
});
//This is undefined
alert($scope.searchIndexes);

ただし、これは $scope を正しく更新していないようです。たとえば、 $scope.searchIndexes の値が定義されており、関数内で正しいデータを持っていますが、外部では未定義です。何が起こっているのですか? また、コールバック関数内だけでなく、コントローラー全体に対して $scope を更新するにはどうすればよいですか? 助けてくれてありがとう。

4

1 に答える 1

1

WebService.getIndexes関数が非同期 AJAX 呼び出しを行っています。そのalert()すぐ下のコマンドは、呼び出しが行われた直後に実行されますWebService.getIndexesが、バックエンド サービスから実際にデータが返される前に実行されます。したがって、$scopeAJAX 呼び出し内で行う割り当ては、実際にはalert()コマンド (または関数内にないコントローラー内のその他のコード) の後に発生します。

alert($scope.searchIndexes);AJAX 呼び出しの最後に を追加してみてください。このアラートからの出力は、実際には AJAX 呼び出しの外部からの出力のに表示されることに気付くでしょう。alert()

コントローラーの残りの部分を確認せずに回避策を推奨することは困難です。ただし、ここでの一般的な経験則は、$scope.searchIndexes関数内でのみ参照することです。これらの関数がコントローラーが完全にロードされた後にのみ呼び出される限り、$scope.searchIndexes問題なく参照できます。

于 2014-07-23T20:45:49.127 に答える