1

サーバーからデータを取得してコントローラーに送信するサービスがあります。

サービス:

publicApp.angularModule.factory('resultService', function ($http) {
        return {
            getResult: function() {
                return $http.get("/Result/GetResult")
                    .success(function(result) {
                        return result.data;
                    }).error(function(result) {
                        console.log("error" + result);
                    });
            },
        };
    });

コントローラ:

publicApp.angularModule.controller('PublicResultCtrl', function ($scope, $location, resultService) {

    resultService.getResult().then(function (resultResponse) {
        $scope.data = resultResponse.data;
        $scope.graph = [];

        _.forEach($scope.data.TreningExerciseScores, function(item) {
            $scope.graph.push(addDataToGraph(item.Item2, item.Item1));
        });

    });

    var addDataToGraph = function (num, text) {
        return {
            y: num,
            legendText: text,
        };
    };

});

そして、コントローラーからデータを取得するディレクティブがあります。私は次のようにディレクティブを呼び出します:

<div id="graph" style="width: 200px; height: 200px" canvasjs graphData="graph"></div> 

そして、ここに私の指示があります:

publicApp.angularModule.directive('canvasjs', function () {


    return {
        restrict: 'A',
        scope: {data : '=graphData'} ,
        link: function (scope, element, attrs) {

            scope.$watch('data', function (data) {
                    console.log(scope.data);

            });         
        }
    };
});

しかし、scope.data は未定義です。$http.get が非同期操作であることは知っていますが、scope.$watch 更新を取得すべきではありませんか?

4

3 に答える 3

2

コントローラーで promise を処理する場合:

resultService.getResult().then(function (resultResponse) {
        $scope.data = resultResponse.data;
        $scope.graph = [];

        _.forEach($scope.data.TreningExerciseScores, function(item) {
            $scope.graph.push(addDataToGraph(item.Item2, item.Item1));
        });

    });

サービスでそれを処理する必要はありません。

getResult: function() {
                return $http.get("/Result/GetResult");
            },

サービスでエラーのみを処理したい場合は、promise で再度ラップする必要があります。これに使用できます$q.when

getResult: function() {
                return $http.get("/Result/GetResult")
                    .success(function(result) {
                        return $q.when(result.data);
                    }).error(function(result) {
                        // not sure what you want to do here
                        console.log("error" + result);
                        return $q.when(result);

                    });
            },

$q.whenオブジェクトがまだプロミスでない場合、オブジェクトをプロミスでラップします。

于 2013-10-22T15:44:03.833 に答える
0

ハンドラーでデータを返すことはできず、success()それが返されることを期待できません。別の promise をチェーンする ( return defer.promise()) かsuccess、コントローラーで を実行して、結果の $scope を変更する必要があります。$httpまたは、すでに約束されている呼び出し全体を返すだけです。

于 2013-10-22T15:44:04.780 に答える