Closed bopm closed 10 years ago
Ну а трансклюд за компанию, он явно лучше, чем делать его же руками :trollface:
Сейчас повторное инстанцирование работает, есть пример: http://catatron.com/angular-ymaps/examples/map-toggle/ Расскажите пожалйста поподробнее, в какой ситуации у Вас карта повторно не возникает, и каким образом это изменение исправило это
Пример текущей версии. Для того, чтобы убедиться в проблемах, нужно пройти по маршруту: maps - maps detail - return. Маркеры не поднимаются, под картой остается мусор вида "[[object HTMLSpanElement]]". Пример исправленной версии. Все работает при таком же использовании. Ошибку более крупного вида с ненахождением контроллера по причине тормозов при скачивании скрипта я не могу просто так воспроизвести в планкре, но думаю она тоже исправляется этим патчом.
А исправляет моя правка это достаточно очевидным образом. Она из ручного действия которое выполняется только на первой компиляции, делает автоматическое, выполняющеся на каждом переинстанцировании.
Ну так как, все нормально, или что-то нужно доделать/поправить?
Подтверждаю баг. Для его воспроизведения я добавил маркер в эту карту, и он не показывается, если переоткрыть карту во второй раз. Решение с трансклюдом было изначально, но я от него отказался, чтобы не тянуть логику загрузки в код маркера. Все дело в том, что маркер — это не единственный вариант вложенной директивы, на карте можно размещать кластеры, геометрические фигуры и т.д. И я хочу предоставить удобную API для таких штук и беру все дела по загрузке на себя. Кроме того, если использовать ymaps.ready несколько раз, не гарантируется порядок исполнения коллбэков. Поэтому я предлагаю свое решение проблемы. Вам нравится?
Я вижу в этом решении добавление новых костылей для того, чтобы старые не сломались. Я думаю сегодня пойти в эту сторону и переписать логику загрузки полностью. Я добавлю коммиты к этому пулл-реквесту.
Интересный подход, если у вас получится избавиться от $compile и заиспользовать transclude, это будет здорово. Удачи!
Я практически уже добился нужного результата и правлю отвалившиеся части.
На всякий случай текущее состояние: оно работает, но требует промежуточного контейнера. Пока у меня не получилось его заставить добавляться автоматически, я закончу проект на котором этот код используется и потом добью. Ну либо оно добьется в процессе доводки проекта.
Я закоммичу сейчас сюда, но оно ломает все вообще: тесты, примеры. Но я уже утомился его один патчить.
узнаю код из статьи:) на самом деле его можно сильно упростить, убрать приоритеты, transclude: 'element' заменить на transclude: true и т.д. А вот тесты как раз ломаться не должны, они прекрасно протестируют результат всех махинаций.
В свободное время (сегодня-завтра) попробую поправить это сам
Я тоже позанимаюсь ещё. Трансклюд элемент влияет на то, как происходит загрузка. Без него не работает как нужно. В статье, кстати, используется компайл из которого уже деприцирована трансклюд функция. Здесь всё на линк функции.
Получилось неплохо.
Все что нам было нужно, это не пустить compile внутрь карты раньше времени (с помощью terminal:true
) и запустить в то время, когда уже пора (с помощью transcludeFn
)
cc @gmarketer: посмотри, до чего развилось то решение в директиве карт, https://github.com/just-boris/angular-ymaps/commit/41814f0fbe0558150cd08458e04258d3c4562b89
Видимо этот пулл нужно закрыть. Я тогда еще раз принесу пулл с dragend.
@just-boris @bopm красивое решение, браво!
Без этого патча после первого инстанцирования повторное инстанцирование не возможно. Тем самым нельзя пользоваться директивой в отдельном роуте. Она либо падает после ухода и последующего возврата на роут с картой, либо не работает с самого начала если мы были на роуте без карты после обновления страницы (на момент компиляции у нас нет в шаблоне самой директивы). Тесты выполняются, все работает, и при этом теперь это работает в ui-router.