7

私はこれをいじっていますが、基本的には、テキストボックスに入力された住所を地理的にエンコードしています。アドレスが入力されて「Enter」が押された後、dom はすぐには更新されませんが、テキストボックスへの別の変更を待ちます。送信直後にテーブルを更新するにはどうすればよいですか? 私はAngularに非常に慣れていませんが、学んでいます。面白いと思いますが、違う考え方を学ばなければなりません。

これがフィドルと私のcontroller.jsです

http://jsfiddle.net/fPBAD/

var myApp = angular.module('geo-encode', []);

function FirstAppCtrl($scope, $http) {
  $scope.locations = [];
  $scope.text = '';
  $scope.nextId = 0;

  var geo = new google.maps.Geocoder();

  $scope.add = function() {
    if (this.text) {

    geo.geocode(
        { address : this.text, 
          region: 'no' 
        }, function(results, status){
          var address = results[0].formatted_address;
          var latitude = results[0].geometry.location.hb;
          var longitude = results[0].geometry.location.ib;

          $scope.locations.push({"name":address, id: $scope.nextId++,"coords":{"lat":latitude,"long":longitude}});
    });

      this.text = '';
    }
  }

  $scope.remove = function(index) {
    $scope.locations = $scope.locations.filter(function(location){
      return location.id != index;
    })
  }
}
4

1 に答える 1

21

あなたの問題は、geocode関数が非同期であるため、AngularJS ダイジェスト サイクルの外で更新されることです。への呼び出しでコールバック関数をラップすることでこれを修正できます。これにより$scope.$apply、AngularJS は変更があったためにダイジェストを実行することを認識できます。

geo.geocode(
  { address : this.text, 
    region: 'no' 
  }, function(results, status) {
    $scope.$apply( function () {
      var address = results[0].formatted_address;
      var latitude = results[0].geometry.location.hb;
      var longitude = results[0].geometry.location.ib;

      $scope.locations.push({
        "name":address, id: $scope.nextId++,
        "coords":{"lat":latitude,"long":longitude}
      });
    });
});
于 2013-02-22T23:03:39.183 に答える