ddubrava / angular-yandex-maps

🗺️ Yandex.Maps Angular components that implement the Yandex.Maps JavaScript API
https://ddubrava.github.io/angular8-yandex-maps/#/
MIT License
57 stars 7 forks source link

метод (ready) GeoObject срабатывает не всегда, ждет отрисовки карты #76

Closed FrolovIgor closed 3 years ago

FrolovIgor commented 3 years ago

🌎 Environment

Angular CLI: 11.2.3 Node: 12.13.0 OS: darwin x64

Angular: 11.2.4

"angular8-yandex-maps": "11.0.2"

✍️ Description

Добрый день! задавал вопрос [#72] по поводу автоматического открывания ballon, теперь использую метод (ready) геообъекта. Нашел проблему с его работой. Если вкратце: Навесил на событие resultshow объекта searchControl добавление новой точки. Иногда оно срабатывает, иногда нет, помогает только изменение размера окна или зума на карте. Добавление новой точки по клику на карте отрабатывает всегда.

Если отключить событие геообъекта (ready) - точки всегда добавляются и через поиск и через клик на карте.

Пример кода create-geoobject-onsearch-result

ddubrava commented 3 years ago

Привет, т.к. resultshow не в зоне, то он не триггерит change detection, поэтому нет изменений во view. Необходимо либо вызвать detectChanges(), либо обернуть коллбек в зону. (подробнее тут)

  1. Вызов detectChanges() здесь выкидывает ошибки и не работает, т.к.он почему-то вызывается на дестроенном компоненте, поэтому не используем его тут
  2. Вызвать наш коллбэк в зоне
public searchInit(event: YaEvent<ymaps.control.SearchControl>): void {
    event.target.events.add('resultshow', (e: ymaps.Event) =>
      this._zone.run(() => {
        const index = (e.get('index') as unknown) as number;
        const tmp = event.target.getResultsArray()[index] as any;
        const coords = tmp.geometry._coordinates;

        this.points = [];
        this.points.push(new Point(coords[0], coords[1], 100));
      }),
    );
  }

p.s. Наши типы и доки яндекса очень большие и немного кривые, поэтому приходится костылить any & unknown

FrolovIgor commented 3 years ago

Спасибо большое! этот вариант мне помог)