0

私のAngularアプリには、独自のスコープをbaseControllerに注入することで定義された関数にアクセスできるbaseController.jsクラスとクラスがあります。これにより、すべてのコントローラー間で機能を共有できます。exampleController.jsbaseController

getDataFromUrl()から関数を呼び出そうとする場合を除いて、これは機能していexampleControllerます。デバッグ中に、それが呼び出され、呼び出しの関数にgetDataFromUrl()入ることがわかります。その時点で、それは逆シリアル化された JSON オブジェクト (この場合はオブジェクトの配列) であることがわかりますが、コードが最終的にの関数に戻ったとき、最終的に受け取るのは逆シリアル化されたオブジェクトではなく、生の HTTP 応答データ。.success()$http.get()dataexampleControllerinitArray()data

baseController.js:

// Data retrieval function for all derived controllers
$scope.getDataFromUrl = function (url) {
    return $http.get(url)
    .success(function (data) {
        return data;
    })
    .error(function () {
        return null;
    });
};

exampleController.js:

appModule.controller('exampleController', [
        '$scope', '$controller', '$http', '$window', '$location', '$timeout',
        function ($scope, $controller, $http, $window, $location, $timeout) {
            var base = $controller('baseController', { $scope: $scope });

            // Initiate an array of data
            var initArray = function (data) {
                $scope.sortedArray = sortDataByDate(data);
            };

            // Calling function in scope defined by base controller class
            $scope.getDataFromUrl('resources/data').then(function (data) {
                initArray(data);
            });
}]);

がHTTP 応答としてdata戻ってくるのはなぜですか? exampleControllerデシリアライズされたJSONのままにしておきたい!

4

2 に答える 2

0

.then()結果として起動しないため、生の応答データ.success()を取得していたことがわかりました。その結果、子コントローラーに到達するデータは最初から逆シリアル化されませんでした。正しいコードは次のとおりです。

baseController.js:

// Data retrieval function for all derived controllers
$scope.getDataFromUrl = function (url, successFunction) {
    $http.get(url)
    .success(function (data) {
        successFunction(data);
    })
    .error(function () {
        return null; // Or whatever you want to return
    });
};

exampleController.js:

appModule.controller('exampleController', [
        '$scope', '$controller', '$http', '$window', '$location', '$timeout',
        function ($scope, $controller, $http, $window, $location, $timeout) {
            var base = $controller('baseController', { $scope: $scope });

            // Initiate an array of data
            var initArray = function (data) {
                $scope.sortedArray = sortDataByDate(data);
            };

            // Calling function in scope defined by base controller class
            $scope.getDataFromUrl('resources/data', function (data) {
                initArray(data);
            });
}]);
于 2014-08-08T14:48:22.707 に答える