Угловая 2 интерполяция, не работающая внутри слушателя карт google [дубликат]

В оболочке вы можете анализировать HTML , используя:


Связанный (почему вы не должны использовать регулярное выражение):

3
задан PierreDuc 2 February 2017 в 14:33
поделиться

2 ответа

Кто-то застрелит меня, если я ошибаюсь, но, насколько я знаю, вам нужно использовать это, если вы загрузите внешний скрипт после загрузки zone.js. Это означает, что любые изменения внутри этого скрипта не будут обнаружены обнаружением изменений. Это происходит при загрузке карт Google позже. Может быть ....

В любом случае, если это так, тогда вы должны использовать метод ngZone.run.

Если вы хотите вручную запускать что-то вне обнаружения изменений, если вы хотите заставить что-то не запускать его, вы должны использовать runOutsideAngular. Это не ваш прецедент, поэтому вы можете безопасно удалить это.

Наиболее частое использование этой службы заключается в оптимизации производительности при запуске работы, состоящей из одной или нескольких асинхронных задач, t требуется обновление пользовательского интерфейса или обработка ошибок, которые будут обрабатываться с помощью углового устройства. Такие задачи можно запустить с помощью runOutsideAngular, и при необходимости эти задачи могут повторно войти в угловую зону через run.

. Но, с другой стороны, вы отмечаете, что привязка данных в dww работаю для вас (ngModel). Я думаю, что реальная проблема заключается в том, что вы обновляете свойство на существующем объекте. Это само по себе не вызывает двухстороннее обнаружение изменений и является фактической причиной, по которой работает ngZone.run. Если это так, то changeRef.detectChanges не будет работать, и вам лучше использовать ApplicationRef и сделать tick(). Или не используйте двустороннюю привязку данных и используйте шаблон data goes down, events go up.

constructor(private appRef: ApplicationRef){}

getLocation(address: string): void {
  let mygc = new google.maps.Geocoder();

  mygc.geocode({
    'address': address
  }, (results, status) => {

      let data: any = results[0];

      this.myObject.myData = {          
         lat: data.geometry.location.lat(),
         lng: data.geometry.location.lng()
      };

      this.appRef.tick();
  });
}

Это, очевидно, работает, поскольку оно ничем не отличается от ngZone.run. Но основная причина, по которой обнаружение изменений не срабатывает, заключается в том, что google.maps использует свои собственные вызовы events / addEventListener. Эти события не называются обезьяной, запятнанными zone.js, и поэтому они не запускаются в угловой зоне, что логически не приведет к циклу обнаружения изменений.

Таким образом, вы можете решить это, используя ngZone.run или ApplicationRef.tick. Где я полагаю, что ngZone.run имеет наибольший смысл, потому что он позволяет вам (re) войти в угловую зону, что именно вы хотите.

Для «хорошего» чтения о NgZone вы может проверить api

5
ответ дан PierreDuc 16 August 2018 в 02:39
поделиться
  • 1
    Я включаю скрипт Google Maps в нижний колонтитул, после того, как все загружено ... так что вы можете быть здесь. – uglycode 2 February 2017 в 12:06
  • 2
    @uglycode обновил мой ответ немного больше – PierreDuc 2 February 2017 в 12:12
  • 3
    Спасибо за Ваш ответ! Частично это объясняет, почему ngZone работает ... как вы думаете, он ошибочно используется в моем случае? Использует ApplicationRef лучший, более правильный подход? – uglycode 2 February 2017 в 12:25
  • 4
    ApplicationRef имеет больше смысла. Другой подход может состоять в том, чтобы испустить событие updateLocation.emit({data.geometry.location.lat(), data.geometry.location.lon()} и подписаться на это событие, где вы показываете этот объект :) – PierreDuc 2 February 2017 в 12:27
  • 5
    Вы знаете, что я заметил? Если я нажму кнопку, которая дважды вызывает этот вызов, он отображает данные. Просто не, если я нажал один раз ... и я поставил тег сценария выше всего остального, и он все еще не работает нормально. Работает галочка (), но зачем она нужна? – uglycode 2 February 2017 в 12:55

Я использую просто:

  import { NgZone } from '@angular/core';

  constructor(
    private zone: NgZone
  ) { super(); }


 getLocation(address: string): void {
  var mygc = new google.maps.Geocoder();
  var self = this;

  mygc.geocode({
    'address': address
  }, (results, status) => {

    var data: any = results[0];

    self.zone.run(() => {
      self.myObject.myData = {          
        lat: data.geometry.location.lat(),
        lng: data.geometry.location.lng()
      };
    });
});
1
ответ дан Fabrizio Caldarelli 16 August 2018 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: