angularjs - 从 Controller 中的输入获取自动完成值

标签 angularjs

我的观点如下:

<label for="txtFrom">Pickup Location</label>
<input type="text" id="pickup" placeholder="Address, aiport, train station, hotel..." ng-model="pickup">
<label for="txtDestination">Destination</label>
<input type="text" id="destination" placeholder="Address, aiport, train station, hotel..." ng-model="destination">
<input class="btn btn-success" name="calcPrice" id="calcPrice" type="submit" value="Calculate Price" ng-click="calcPrice()">

我使用谷歌地图 API 来自动完成输入框的地点,因此如果用户开始输入“Lo”,他将获得以“Lo”开头的地点列表,例如他选择伦敦。

问题出在我的 Controller 中,我没有得到完整的自动完成值。我只得到用户最初输入的内容,在本例中为“Lo”。

这是我的 Controller :

app.controller('BookingsCtrl', function($scope, BookingsService) {
  $scope.pickup = "";
  $scope.destination = "";
  $scope.syncNotification = "";

  $scope.calcPrice = function() {
    console.log($scope.pickup);

    BookingsService.save({
      pickup: $scope.pickup,
      destination: $scope.destination
    }, function(response) {
      console.log(response.message);
    });
  };
});

编辑: 这也是 JS 的片段:

var pickup = document.getElementById('pickup');

var options = {
    componentRestrictions: {
        country: 'ee'
    }
};

var autocompletePickup = new google.maps.places.Autocomplete(pickup, options);

google.maps.event.addListener(autocompletePickup, 'place_changed', function () {

    var place = autocompletePickup.getPlace();
    pickup.innerHtml =  place.formatted_address;
    var lat = place.geometry.location.lat();
    var long = place.geometry.location.lng();

});

编辑2:添加服务

app.service('BookingsService', function ($resource) {
  return $resource('http://localhost:3000/', {});
});

编辑 3:模板

<!doctype html>
<html lang="en">
  <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet" href="components/bootstrap/dist/css/bootstrap.min.css" type="text/css" />
  <link rel="stylesheet" href="assets/css/style.css" type="text/css" />
  <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDt1Y30OssBToIzSCOr3g5IkN3c0D75XVE&libraries=places"
     ></script>
</head>
<body ng-app='strelsau_client'>
  <div class="site-wrapper">
     <div class="site-wrapper-inner">
        <div class="cover-container">
           <div class="masthead clearfix">
              <div class="inner">
                 <img class="masthead-brand" src="../assets/img/logo.png">
                 <nav>
                    <ul class="nav masthead-nav">
                       <li class="active"><a href="#">Home</a></li>
                       <li><a href="#">Contact</a></li>
                    </ul>
                 </nav>
              </div>
           </div>
           <div ng-view>
           </div>
        </div>
     </div>
  </div>
  <script src="components/jquery/dist/jquery.min.js"></script>
  <script src="components/bootstrap/dist/js/bootstrap.min.js"></script>
  <script src="components/angular/angular.min.js"></script>
  <script src="components/angular-route/angular-route.min.js"></script>
  <script src="components/angular-resource/angular-resource.min.js"></script>
  <script src="js/main.js"></script>
  <script src="js/controllers/bookings_controllers.js"></script>
  <script src="js/services/bookings_service.js"></script>
</body>
</html>

最佳答案

事实上,一旦地点被解析,pickup 输入元素就不会更新。

这个函数的问题:

google.maps.event.addListener(autocompletePickup, 'place_changed', function () {

    var place = autocompletePickup.getPlace();
    pickup.innerHtml =  place.formatted_address; //invalid
    //...
});

要设置输入字段值,应使用 value 属性。

无论如何,给定示例,尝试将其替换为:

(function (scope) {
            google.maps.event.addListener(autocompletePickup, 'place_changed', function () {
                var place = autocompletePickup.getPlace();
                scope.pickup = place.formatted_address;
            });
        })($scope);

示例

angular.module('myApp', [])

    .controller('BookingsCtrl', function ($scope) {

        $scope.pickup = "";
        $scope.destination = "";
        $scope.syncNotification = "";

        var pickup = document.getElementById('pickup');

        var options = {
            componentRestrictions: {
                country: 'ee'
            }
        };
        var autocompletePickup = new google.maps.places.Autocomplete(pickup, options);

        (function (scope) {
            google.maps.event.addListener(autocompletePickup, 'place_changed', function () {
                var place = autocompletePickup.getPlace();
                scope.pickup = place.formatted_address;
            });
        })($scope);

        $scope.calcPrice = function () {
            console.log($scope.pickup);
            alert($scope.pickup);

            /*BookingsService.save({
                pickup: $scope.pickup,
                destination: $scope.destination
            }, function (response) {
                console.log(response.message);
            });*/
        };
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?libraries=places"></script>
<div ng-app="myApp" ng-controller="BookingsCtrl" ng-cloak>
        <label for="txtFrom">Pickup Location</label>
        <input type="text" id="pickup" placeholder="Address, aiport, train station, hotel..." ng-model="pickup">
        <label for="txtDestination">Destination</label>
        <input type="text" id="destination" placeholder="Address, aiport, train station, hotel..." ng-model="destination">
        <input class="btn btn-success" name="calcPrice" id="calcPrice" type="submit" value="Calculate Price" ng-click="calcPrice()">
    </div>

关于angularjs - 从 Controller 中的输入获取自动完成值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40774897/

相关文章:

javascript - 从表单监视更新时更新 Angular Directive 模型的值时出现问题

javascript - AngularJS 观察者 : oldValue equal to newValue in unit test

angularjs - 在 ng-repeat 中动态添加指令

angularjs - 组件内部的 Angular2 表单验证

javascript - 是否可以在 AngularJS 中调用函数并显示值

javascript - 检查 Angular 数组中的值

angularjs - $route.current 在尝试获取当前参数时未定义

javascript - Angularjs 模板 grunt-angular-templates 生成的缓存路径

javascript - 在 AngularJS 模板中增加一个变量

angularjs - 如何访问 angularjs 中的 $rootscope 变量?