just-boris / angular-ymaps

Yandex Maps API as an Angular JS direcitive
http://catatron.com/angular-ymaps/
51 stars 22 forks source link

Используем трансклюд и заменяем compile на link #7

Closed bopm closed 10 years ago

bopm commented 10 years ago

Без этого патча после первого инстанцирования повторное инстанцирование не возможно. Тем самым нельзя пользоваться директивой в отдельном роуте. Она либо падает после ухода и последующего возврата на роут с картой, либо не работает с самого начала если мы были на роуте без карты после обновления страницы (на момент компиляции у нас нет в шаблоне самой директивы). Тесты выполняются, все работает, и при этом теперь это работает в ui-router.

bopm commented 10 years ago

Ну а трансклюд за компанию, он явно лучше, чем делать его же руками :trollface:

just-boris commented 10 years ago

Сейчас повторное инстанцирование работает, есть пример: http://catatron.com/angular-ymaps/examples/map-toggle/ Расскажите пожалйста поподробнее, в какой ситуации у Вас карта повторно не возникает, и каким образом это изменение исправило это

bopm commented 10 years ago

Пример текущей версии. Для того, чтобы убедиться в проблемах, нужно пройти по маршруту: maps - maps detail - return. Маркеры не поднимаются, под картой остается мусор вида "[[object HTMLSpanElement]]". Пример исправленной версии. Все работает при таком же использовании. Ошибку более крупного вида с ненахождением контроллера по причине тормозов при скачивании скрипта я не могу просто так воспроизвести в планкре, но думаю она тоже исправляется этим патчом.

bopm commented 10 years ago

А исправляет моя правка это достаточно очевидным образом. Она из ручного действия которое выполняется только на первой компиляции, делает автоматическое, выполняющеся на каждом переинстанцировании.

bopm commented 10 years ago

Ну так как, все нормально, или что-то нужно доделать/поправить?

just-boris commented 10 years ago

Подтверждаю баг. Для его воспроизведения я добавил маркер в эту карту, и он не показывается, если переоткрыть карту во второй раз. Решение с трансклюдом было изначально, но я от него отказался, чтобы не тянуть логику загрузки в код маркера. Все дело в том, что маркер — это не единственный вариант вложенной директивы, на карте можно размещать кластеры, геометрические фигуры и т.д. И я хочу предоставить удобную API для таких штук и беру все дела по загрузке на себя. Кроме того, если использовать ymaps.ready несколько раз, не гарантируется порядок исполнения коллбэков. Поэтому я предлагаю свое решение проблемы. Вам нравится?

bopm commented 10 years ago

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

just-boris commented 10 years ago

Интересный подход, если у вас получится избавиться от $compile и заиспользовать transclude, это будет здорово. Удачи!

bopm commented 10 years ago

Я практически уже добился нужного результата и правлю отвалившиеся части.

bopm commented 10 years ago

На всякий случай текущее состояние: оно работает, но требует промежуточного контейнера. Пока у меня не получилось его заставить добавляться автоматически, я закончу проект на котором этот код используется и потом добью. Ну либо оно добьется в процессе доводки проекта.

bopm commented 10 years ago

Я закоммичу сейчас сюда, но оно ломает все вообще: тесты, примеры. Но я уже утомился его один патчить.

just-boris commented 10 years ago

узнаю код из статьи:) на самом деле его можно сильно упростить, убрать приоритеты, transclude: 'element' заменить на transclude: true и т.д. А вот тесты как раз ломаться не должны, они прекрасно протестируют результат всех махинаций.

В свободное время (сегодня-завтра) попробую поправить это сам

bopm commented 10 years ago

Я тоже позанимаюсь ещё. Трансклюд элемент влияет на то, как происходит загрузка. Без него не работает как нужно. В статье, кстати, используется компайл из которого уже деприцирована трансклюд функция. Здесь всё на линк функции.

just-boris commented 10 years ago

Получилось неплохо. Все что нам было нужно, это не пустить compile внутрь карты раньше времени (с помощью terminal:true) и запустить в то время, когда уже пора (с помощью transcludeFn)

just-boris commented 10 years ago

cc @gmarketer: посмотри, до чего развилось то решение в директиве карт, https://github.com/just-boris/angular-ymaps/commit/41814f0fbe0558150cd08458e04258d3c4562b89

bopm commented 10 years ago

Видимо этот пулл нужно закрыть. Я тогда еще раз принесу пулл с dragend.

gmarketer commented 10 years ago

@just-boris @bopm красивое решение, браво!