Клуб API Карт

Перетаскивание и сохранение меток ymapsml

Пост в архиве.
var ml = new YMaps.YMapsML('http://someurl.ru/ymapsml.php');

  

Вывод меток из базы работает, но метки не перетаскиваются:

YMaps.Events.observe(ml, ml.Events.Load, function (ml) {

                ml.forEach(function (obj) {

                    YMaps.Placemark( {draggable: true} );

                });

            });

 

И подскажите сразу как реализовать сохранение?

15 комментариев

 

YMaps.Placemark( {draggable: true} );

Во-первых тут написана глупость.

Конструктор метки принимает 2 параметра, - 1-й точку, 2-ой опции.

Вы передаете в него одни опции.

Во-вторых тут вообще не надо его вызывать, т.к. точки уже есть.

Просто установите опции с помощью метода setOptions

 

Сохранение нужно реализовать самостоятельно, перебираете ваши объекты и отправляете на сервер их данные (координаты, содержимое балуна и т.п.)

 

YMaps.Events.observe(ml, ml.Events.Load, function (ml) {ml.forEach(function (obj) {YMaps.Placemark.setOptions({draggable: true});});});

сделал так, не помогло.

 

Это не метод класса, это метод экземпляра класса.

obj.setOptions({draggable: true});

странно, не перетаскиваются

http://codepen.io/anon/pen/urFct

У вас там несколько вложенных коллекций.

Сделайте так:

 

YMaps.Events.observe(ml, ml.Events.Load, function (ml) {    var setDraggable = function (obj) {        if(obj instanceof YMaps.GeoObjectCollection) {            obj.forEach(setDraggable);        }        else {            obj.setOptions({                draggable: true            });        }    };    // Проходим все объекты    setDraggable(ml);});

 

 

спасибо большое, 

а какой аналог getCoordinates() в api 1.1 ?

 

var point = obj.getGeoPoint();

console.log([point.getLat(), point.getLng()]);

или так

console.log(point.toString());

Помогите последний раз пожалуйста, и я отстану)

 

YMaps.Events.observe(ml, ml.Events.Load, function (ml) {

    var setDraggable = function (obj) {

        if (obj instanceof YMaps.GeoObjectCollection) {

            obj.forEach(setDraggable);

        }

        else {

            obj.setOptions({draggable: true});

            var point = obj.getGeoPoint();

            console.log([point.getLat(), point.getLng()]);

        }

    };

setDraggable(ml);

});

Если писать так, то координаты выводятся один раз в самом начале. Надо чтобы по завершению перетаскивания.

надо "подписаться" на событие окончания перетаскивания и получать координаты в обработчике

 разве так не должно работать?
YMaps.Events.observe(ml, ml.Events.DragEnd, function (ml) {    var setDragend = function (obj) {        if (obj instanceof YMaps.GeoObjectCollection) {            obj.forEach(setDragend);        }        else {            var point = obj.getGeoPoint();            console.log([point.getLat(), point.getLng()]);        }    };setDragend(ml);});

Кажется в первом АПИ нельзя вешать обработчик на группу, нужно вешать на каждый геообъект.

Кстати зачем Вам оно?

Лучше уже на новом писать

 

YMaps.Events.observe(ml, ml.Events.Load, function (ml) {   var setDraggable = function (obj) {        if (obj instanceof YMaps.GeoObjectCollection) {            obj.forEach(setDraggable);        }        else {            obj.setOptions({draggable: true});            YMaps.Events.observe(obj, obj.Events.DragEnd, function (obj) {              var point = obj.getGeoPoint();              console.log([point.getLat(), point.getLng()]);            });        }    };    setDraggable(ml);  });

Наверное, это плохой код, но работает :)

Код нормальный, просто речь о том что в новой версии АПИ

можно повесить всего один обработчик на коллекцию, т.к. события каждого геообъекта пропагируются на коллекцию.

И это будет гораздо эффективнее в плане быстродействия и расхода памяти.