dkvasov
@dkvasov

Как передать данные из фабрики в контроллер?

Подскажите, как можно передать полученные через get данные из фабрики, чтобы потом можно было их обработать в контроллере?
var app = angular.module('app',[]);

app.factory('loadData', ['$http', function($http) {
    return function() {
        $http.get('mydata.json').then(
            function(response) {
                // вот здесь как возвратить данные?
                return response
            },
            function(data) {
                // и здесь
                return data
        });
        // или их нужно возвращать здесь??
    };
}]);


app.controller('loadCtrl',['$scope', 'loadData', function($scope, loadData) {
    $scope.info = loadData();
    // а здесь я хочу обработать info
}]);
  • Вопрос задан
  • 350 просмотров
Решения вопроса 1
yarkov
@yarkov
Помог ответ? Отметь решением.
var app = angular.module('app',[]);

app.factory('serviceData', ['$http', function($http) {
    var self = this;

    self.loadData = function() {
        var promise = $http({
                url: 'mydata.json',
                method: 'GET',
                params: {},
                headers: {}
            })
            .then(function (response) {
                var response_data = angular.fromJson(response.data);
                return response_data;
            });
        return promise;
    };

    return self;
}]);


app.controller('loadCtrl',['$scope', 'serviceData', function($scope, serviceData) {
    // а здесь я хочу обработать info
    serviceData.loadData()
        .then(function (response_data) {
            $scope.info = response_data;
        });;
}]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
через get данные из фабрики


Так, давайте разберемся с начала что такое "фабрика". Фабрика - это способ получения сервисов. То есть это та вещь которая вызывается контейнером зависимостей ангуляра при создании сервиса и все.

Так что давайте будем называть это сервисом.

чтобы потом можно было их обработать в контроллере?


Далее. Читаем документацию относительно такой вещи как promises (можно не в контексте ангуляра даже). Вы как js разработчик обязаны понимать что такое event loop, почему все взаимодействие с внешним миром должно происходить асинхронно и как с этим жить (колбэки, промисы, yield и async/await).

Далее. Старайтесь использовать ресолверы маршрутизатора для получения данных. Тогда данные будут приходить готовыми.

Ну и последнее. Отказывайтесь от $scope и от контроллеров. Используйте компоненты. Сейчас на дворе 2016-ый год и актуальная версия ангуляра 1.5, да и вторая на подходе. Не стоит использовать материалы для обучения 5-ти летней давности.

как раз пару недель назад наконец-то обновили официальные туториалы ангуляра под современный подход с учетом наработанных лучших практик: https://github.com/angular/angular-phonecat
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы