Ошибка: «fourSquareService.getVenues не является функцией» - PullRequest
0 голосов
/ 28 мая 2018

AngularJs - как использовать фабрику с вводом формы как часть URL для извлечения?

Первый вопрос здесь.Я изучаю angular и пытаюсь использовать отдельные файлы для своих сервисов, а также использую пользовательский ввод в форму как часть URL запроса.Я заработал, введя $ http на мой контроллер и вызвав службу внутри функции «по щелчку», но чтобы сохранить чистоту, я действительно хочу сохранить службы в отдельных файлах и вызывать их внутри моего контроллера.Я попытался вернуть функцию с одним атрибутом в мой сервис, чтобы я мог проанализировать ввод (ng-model = "cityInput") при вызове.Но когда я вызываю его на своем контроллере (после добавления сервиса в качестве зависимости), он выдает мне сообщение «fourSquareService.getVenues не является функцией».Что я делаю неправильно?Заранее спасибо. Код ниже:

сервис Foursquare

 // Foursquare API Info
    const clientId = 'PU3IY1PZEOOANTPSHKNMS5HFSMEGEQ1IAVJYGYM4YVZP3NGD';
    const clientSecret = '0V21IXU0EETE3SZJGGCP4T4R13NUTBJ0LMI5WQY45IMDPEKY';
    const url = 'https://api.foursquare.com/v2/venues/explore?near=';
    const imgPrefix = 'https://igx.4sqi.net/img/general/150x200';

    // Current day
    function getCurrentDate() {
        let today = new Date();
        let yyyy = today.getFullYear();
        let mm = today.getMonth() + 1;
        let dd = today.getDate();
        if (dd < 10) {
            dd = '0' + dd
        }
        if (mm < 10) {
            mm = '0' + mm
        }
        return yyyy + mm + dd;
    };
    let currentDay = getCurrentDate();

    //Foursquare Angular request
    app.factory('fourSquareService', ['$http', function ($http) {
        return {
            getVenues: function(place) {
            const fourSquareURL = `${url}${place}&venuePhotos=1&limit=5&client_id=${clientId}&client_secret=${clientSecret}&v=${currentDay}`;
            return $http.get(fourSquareURL);
        }
    }
    }]);

Сервис APIXU

// APIXU Info
const apiKey = '44972f525fb14478ac0224821182604';
const forecastUrl = 'https://api.apixu.com/v1/forecast.json?key=';

//Angular request
app.factory('apixuService', ['$http', function ($http) {
    return {
        getForecast: function (place) {
            const apixuURL = `${forecastUrl}${apiKey}&q=${place}&days=4&hour=10`;
            return $http.get(apixuURL);
        },
        getCurrentWeather: function (place) {
            const currentWeatherUrl = `${forecastUrl}${apiKey}&q=${place}`;
            return $http.get(currentWeatherUrl);
        }
    };
}]);

Контроллер

app.controller('MainController', ['$scope', 'apixuService', 'fourSquareService', function ($scope, fourSquareService, apixuService) {
    //Search on Click Function
    $scope.executeSearch = function () {

        //Venues
        fourSquareService.getVenues($scope.cityInput).then(function (response) {
            $scope.fouSquareData = response.data.response
            $scope.destination = $scope.fouSquareData.geocode.displayString;
            $scope.venues = $scope.fouSquareData.groups[0].items.map(spot => spot.venue);
            let photos = [];
            $scope.venues.forEach((venue, index) => venue.photos.groups[0] && venue.url ? photos.push(`<a href="${venue.url}" target="_blank"><img class="venueimg" src="${imgPrefix}${venue.photos.groups[0].items[0].suffix}"/></a>`) : venue.photos.groups[0] ? photos.push(`<img class="venueimg" src="${imgPrefix}${venue.photos.groups[0].items[0].suffix}"/>`) : photos.push('<img class="venueimg" src="./img/320px-No_image_available.png"/>'));
            $scope.photos = photos;
        }, function (error) {
            $scope.showdestination = true;
            $scope.showData = false;
            $scope.destination = 'Place not found, please try again.';
        });

        //Current Weather
        getWeather.getCurrentWeather($scope.cityInput).then(function (response) {
            $scope.currentWeather = response.data.current;
            $scope.place = response.data.location.name;
        });

        //Forecast
        getWeather.getForecast($scope.cityInput).then(function (response) {
            $scope.showdestination = true;
            $scope.showData = true;
            $scope.forecast = response.data.forecast.forecastday;
            const weekDays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
            $scope.weekDays = [];
            $scope.forecast.forEach(function (day, index) {
                $scope.weekDays[index] = weekDays[(new Date(day.date)).getDay()]
            });
            $scope.weekDays[0] = 'Today';
            $scope.weekDays[1] = 'Tomorrow';
        });

    };

}]);

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я изменил порядок параметров внутри функции контроллера, чтобы соответствовать тому же порядку зависимостей, и это сработало!Не знал, что заказ важен.

рабочий контроллер:

 app.controller('MainController', ['$scope', 'fourSquareService', 'apixuService', 
function ($scope, fourSquareService, apixuService) {
        //Search on Click Function
        $scope.executeSearch = function () {

            //Venues
            fourSquareService.getVenues($scope.cityInput).then(function (response) {
                $scope.fouSquareData = response.data.response
                $scope.destination = $scope.fouSquareData.geocode.displayString;
                $scope.venues = $scope.fouSquareData.groups[0].items.map(spot => spot.venue);
                let photos = [];
                $scope.venues.forEach((venue, index) => venue.photos.groups[0] && venue.url ? photos.push(`<a href="${venue.url}" target="_blank"><img class="venueimg" src="${imgPrefix}${venue.photos.groups[0].items[0].suffix}"/></a>`) : venue.photos.groups[0] ? photos.push(`<img class="venueimg" src="${imgPrefix}${venue.photos.groups[0].items[0].suffix}"/>`) : photos.push('<img class="venueimg" src="./img/320px-No_image_available.png"/>'));
                $scope.photos = photos;
            }, function (error) {
                $scope.showdestination = true;
                $scope.showData = false;
                $scope.destination = 'Place not found, please try again.';
            });

            //Current Weather
            apixuService.getCurrentWeather($scope.cityInput).then(function (response) {
                $scope.currentWeather = response.data.current;
                $scope.place = response.data.location.name;
            });

            //Forecast
            apixuService.getForecast($scope.cityInput).then(function (response) {
                $scope.showdestination = true;
                $scope.showData = true;
                $scope.forecast = response.data.forecast.forecastday;
                const weekDays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
                $scope.weekDays = [];
                $scope.forecast.forEach(function (day, index) {
                    $scope.weekDays[index] = weekDays[(new Date(day.date)).getDay()]
                });
                $scope.weekDays[0] = 'Today';
                $scope.weekDays[1] = 'Tomorrow';
            });

        };

    }]);
0 голосов
/ 28 мая 2018

У вас несоответствие в ссылках на ваши зависимости

Это должно быть

app.controller('MainController', ['$scope', 'apixuService', 'fourSquareService', 
function ($scope, apixuService, fourSquareService) {
        //Search on Click Function
        $scope.executeSearch = function () {

        //Venues
        fourSquareService.getVenues($scope.cityInput).then(function (response) {
            $scope.fouSquareData = response.data.response
            $scope.destination = $scope.fouSquareData.geocode.displayString;
            $scope.venues = $scope.fouSquareData.groups[0].items.map(spot => spot.venue);
            let photos = [];
            $scope.venues.forEach((venue, index) => venue.photos.groups[0] && venue.url ? photos.push(`<a href="${venue.url}" target="_blank"><img class="venueimg" src="${imgPrefix}${venue.photos.groups[0].items[0].suffix}"/></a>`) : venue.photos.groups[0] ? photos.push(`<img class="venueimg" src="${imgPrefix}${venue.photos.groups[0].items[0].suffix}"/>`) : photos.push('<img class="venueimg" src="./img/320px-No_image_available.png"/>'));
            $scope.photos = photos;
        }, function (error) {
            $scope.showdestination = true;
            $scope.showData = false;
            $scope.destination = 'Place not found, please try again.';
        });

        //Current Weather
        apixuService.getCurrentWeather($scope.cityInput).then(function (response) {
            $scope.currentWeather = response.data.current;
            $scope.place = response.data.location.name;
        });

        //Forecast
        apixuService.getForecast($scope.cityInput).then(function (response) {
            $scope.showdestination = true;
            $scope.showData = true;
            $scope.forecast = response.data.forecast.forecastday;
            const weekDays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
            $scope.weekDays = [];
            $scope.forecast.forEach(function (day, index) {
                $scope.weekDays[index] = weekDays[(new Date(day.date)).getDay()]
            });
            $scope.weekDays[0] = 'Today';
            $scope.weekDays[1] = 'Tomorrow';
        });

    };

}]);
...