0

モデル プロバイダーからデータを取得したいのですが、コントローラーで取得できるのは「未定義」だけです。

コードは次のとおりです。

コントローラー

pdmAtWeb.controller('SearchCtrl', function($scope, ItemModel){
$scope.updateTableFromSearch = function(){
        $scope.myData = ItemModel.findAllItems();
        console.log($scope.myData);
};});

プロバイダ

pdmAtWeb.provider('ItemModel', function () {
this.defaultEndpoint = '/item';
this.defaultServiceUrl = 'http://localhost:8080/webservice';

this.setDefaultEndpoint = function (newEndpoint) {
    this.defaultEndpoint = newEndpoint;
};

this.setDefaultServiceUrl = function (newServiceUrl) {
    this.defaultServiceUrl = newServiceUrl;
}

this.$get = function ($http) {
    var endpoint = this.endpoint;
    var serviceUrl = this.serviceUrl;

    var refreshConnection = function () {
        // reconnect
    }
    return{
        findAllItems: function () {
            $http({method: 'GET', url: serviceUrl + endpoint}).
                success(function (data, status, headers, config) {
                    console.log(data);
                    return data;

                }).
                error(function (data, status, headers, config) {

                });
        }
    }
}});

プロバイダー「ItemModel」は、Web サービスから正しいデータを受け取ります。おそらくこれは非同期の問題ですが、よくわかりません。

アップデート

遅延/約束の実装を追加すると、期待どおりに機能します。最終的なコードは次のとおりです。

コントローラー

pdmAtWeb.controller('SearchCtrl', function($scope, ItemModel){
$scope.updateTableFromSearch = function(){
       ItemModel.findAllItems().then(function(data){
          console.log(data);
           $scope.myData = data;
       });
};
});

プロバイダ

pdmAtWeb.provider('ItemModel', function () {
    this.defaultEndpoint = '/item';
    this.defaultServiceUrl = 'http://localhost:8080/webservice';

    this.setDefaultEndpoint = function (newEndpoint) {
        this.defaultEndpoint = newEndpoint;
    };

    this.setDefaultServiceUrl = function (newServiceUrl) {
        this.defaultServiceUrl = newServiceUrl;
    }

    this.$get = function ($http, $q) {
        var endpoint = this.defaultEndpoint;
        var serviceUrl = this.defaultServiceUrl;

        var refreshConnection = function () {
            // reconnect
        }
        return{
            findAllItems: function () {
                var deferred = $q.defer();

                 $http({method: 'GET', url: serviceUrl + endpoint}).
                    success(function (data, status, headers, config) {
                     deferred.resolve(data);
                    }).
                    error(function (data, status, headers, config) {
                      deferred.reject();
                    });
                return deferred.promise;
            }
        }
    }
});
4

1 に答える 1

0

これを達成するために deferred は必要ありません。あなた$httpはすでに約束を返します。最初の例では、 undefined を取得している理由は、何も返していないためです。を確認してくださいfindAllItems。何も返していません。

そうすればreturn $http.get(.....)、 deferred を明示的に使用しなくてもすべてが機能するはずです。

修正版は次のとおりです。

pdmAtWeb.provider('ItemModel', function () {
this.defaultEndpoint = '/item';
this.defaultServiceUrl = 'http://localhost:8080/webservice';

this.setDefaultEndpoint = function (newEndpoint) {
    this.defaultEndpoint = newEndpoint;
};

this.setDefaultServiceUrl = function (newServiceUrl) {
    this.defaultServiceUrl = newServiceUrl;
}

this.$get = function ($http) {
    var endpoint = this.endpoint;
    var serviceUrl = this.serviceUrl;

    var refreshConnection = function () {
        // reconnect
    }
    return{
        findAllItems: function () {
            //NOTE addition of return below.
            return $http({method: 'GET', url: serviceUrl + endpoint}).
                success(function (data, status, headers, config) {
                    console.log(data);
                    //NOTE: YOU SHOULD ALSO return data here for it to work.  
                    return data;

                }).
                error(function (data, status, headers, config) {

                });
        }
    }
}});
于 2013-03-25T10:10:29.617 に答える