0

Моя директива использует сервис, который возвращает обещание, мне нужно отобразить в шаблоне атрибуты области geoZip, geoCity и geoState.Угловая директива не отображает значения области видимости

Проблема в том, что эти переменные области не отображаются в шаблоне, я просто вижу запятую.

Что делать, чтобы отображать переменные области видимости?

Это моя директива код:

.directive('cityStateZip', function() { 
     return { 
     restrict: 'A', 
     transclude: true, 
     scope: { 
      zip: '=', 
     }, 
     template: '<p>{{geoCity}}, {{geoState}} {{geoZip}}</p>', 
     controller: ['$scope', 'GeolocationService', function ($scope, GeolocationService) { 
      GeolocationService.geocode($scope.zip).then(function(result) { 
      if (result) { 
       console.log(result); 
       $scope.geoZip = result['address_components'][0]['long_name']; 
       $scope.geoCity = result['address_components'][1]['long_name']; 
       $scope.geoState = result['address_components'][2]['short_name']; 
      } 
      }); 
     }] 
     }; 
    }) 

.service('GeolocationService', ['underscore', '$q', function (underscore, $q) { 
    var gs = {}; 

    gs.geocode = function(address) { 
    var geocoder = new google.maps.Geocoder(); 
    var deferred = $q.defer(); 
    geocoder.geocode({ "address": address }, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK && results.length > 0) { 
     return deferred.resolve(underscore.first(results)); 
     } 
     return deferred.reject(); 
    }); 
    return deferred.promise; 
    } 

    return gs; 
}]); 
+1

Показать функцию 'geocode()' service. Судя по именам свойств, похоже, что вы используете google ... который находится вне углового контекста, и вам понадобится $ apply, где-то там, чтобы сказать, угловато, чтобы запустить дайджест – charlietfl

+0

да, но как я должен использовать метод $ apply в своем коде ? – user1262904

+1

Может использовать его в функции обслуживания ... в обратном вызове google geocode или в контроллере. Любопытно, но какое обещание возвращается – charlietfl

ответ

1

я обнаружил, что я должен использовать сервис $ таймаут, чтобы сделать его работу:

.directive('cityStateZip', function() { 
    return { 
    restrict: 'A', 
    transclude: true, 
    scope: { 
     zip: '=', 
    }, 
    template: '<p>{{geoCity}}, {{geoState}} {{geoZip}}</p>', 
    controller: ['$scope', '$timeout', 'GeolocationService', function ($scope, $timeout, GeolocationService) { 
     GeolocationService.geocode($scope.zip).then(function(result) { 
     if (result) { 
      console.log(result); 
      $timeout(function() { 
      $scope.geoZip = result['address_components'][0]['long_name']; 
      $scope.geoCity = result['address_components'][1]['long_name']; 
      $scope.geoState = result['address_components'][2]['short_name']; 
      }); 
     } 
     }); 
    }] 
    }; 
}) 

Пожалуйста, дайте мне знать, если есть лучшая альтернатива (не используя $ timeout), спасибо!

+1

'$ timeout' рекомендуется авторами AngularJS как лучший способ сделать« безопасный $ apply ». GeolocationService является асинхронным для цикла digest AngleJS. '$ timeout' дает браузеру возможность догнать и синхронизировать с циклом дайджест. – georgeawg