【问题标题】:AngularJS - not getting return value to controller or viewAngularJS - 没有将返回值返回给控制器或视图
【发布时间】:2017-04-30 20:18:15
【问题描述】:

我正在做一个地理定位和反向地理编码应用程序。函数绑定到单击按钮以将我的控制器中的函数调用到我的服务。该服务有些工作,它正在获取值,但我无法让它将值返回给我的控制器。

我之前在承诺和回报方面遇到了更多问题,其中一些我解决了,但显然不是全部。感谢您的帮助。

我的服务'geoService':

(function() {
    'use strict';
    angular.module('JourneyApp').factory('geoService',
    [
        '$q',
        function($q) {
            var geoServiceFactory = {};

            function getLocation(location) {

                var deferred = $q.defer();

                if (navigator.geolocation) {
                    navigator.geolocation.getCurrentPosition(showPosition, error);

                } else {
                    console.log("No support for Geolocation");
                    deferred.reject(false);
                }
                return deferred.promise;
            }
            function error(error) {
                console.log(error);
            }

            function showPosition(position) {

                var deferred = $q.defer();
                var geocoder = new google.maps.Geocoder();
                var coords = position.coords;
                var latlng = { lat: parseFloat(coords.latitude), lng: parseFloat(coords.longitude) };

                geocoder.geocode({ 'location': latlng },
                    function (results, status) {
                        if (status === google.maps.GeocoderStatus.OK) {
                            console.log(results);
                            if (results[0]) {
                                var formattedAddress = results[0].formatted_address;
                                console.log(formattedAddress);
                                deferred.resolve(formattedAddress);
                            } else {
                                console.log("No match, sorry");
                                deferred.reject("Error");
                            }
                        } else {
                            console.log("Error, sorry");
                            deferred.reject("Error");
                        }
                    });
                return deferred.promise;
            }

            geoServiceFactory.getLocation = getLocation;
            geoServiceFactory.showPosition = showPosition;

            return geoServiceFactory;
        }
    ]);
})();

这是我的控制器:

(function() {
    'use strict';
    angular.module('JourneyApp').controller('tripsController',
    [
        'tripsService', 'vehicleService', 'geoService', function(tripsService, vehicleService, geoService) {
            //'tripsService', function (tripsService) {

            var vm = this;

            // Get start geolocation
            vm.getStartLocation = function() {
                geoService.getLocation().then(function (location) {
                    vm.trip.startAdress = location;
                });
            }

            // Get stop geolocation
            vm.getStopLocation = function() {
                geoService.getLocation().then(function(location) {
                    vm.trip.stopAdress = location;
                });
            }
        }
    ]);
}());

以及我的部分观点:

<div class="col-md-2">
    <input ng-model="vm.trip.startAdress"/>
</div>
<div class="col-md-2">
    <button ng-click="vm.getStartLocation()">Get location</button>
</div>

我在这里做错了什么,我该如何解决?

【问题讨论】:

  • getLocation 中,您正在创建一个延迟对象并返回它的承诺,但从未真正解决它。你必须这样做。这是让它工作的第一步,但由于你的 showPosition 也返回一个承诺,你也必须找到一种方法来解决这个问题。

标签: javascript angularjs geocoding angular-promise deferred


【解决方案1】:

正如我在评论中提到的,getLocation 中创建的承诺永远不会被解决,因此该值永远不会被存储。以下应该可以解决问题(用此代码替换 getLocation 中的 if):

[...]
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {
        showPosition(position).then(function(formattedAddress) {
            deferred.resolve(formattedAddress);
        }
    }, error);
} else {
[...]

【讨论】:

  • 对。但是现在当我用那个替换 if 时,我得到 'TypeError: Cannot set property 'startAdress' of null'。
  • 你没有初始化vm.trip。只需在var vm = this; 行后执行vm.trip = {};
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
相关资源
最近更新 更多