Клуб API Карт

Изменение описание при смене типа маршрутизации?

mallinna.rst
9 ноября 2015, 10:03

Подскажите, пожалуйста, как при нажатии на кнопку общественный транспорт перестраивать описание?

http://jsfiddle.net/qqy024r7/32/

 

Выходит так, что мультимаршрут перестраивается, а описание нет.

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

наверное надо вызывать makeDescrSegment при обновлении маршрута?

 

ymaps.modules.define('MultiRouteActiveDescr', [

    'util.defineClass'

], function (provide, defineClass) {

    function ActiveRouteDescr (multiRoute,multiRouteModel) {

        this.multiRoute = multiRoute;

this.multiRouteModel= multiRouteModel;

 

        // Подписываемся на события обновления мультимаршрута

        // и смены активного маршрута.

        multiRoute.events

            .add("update", this.onMultiRouteUpdate, this)

            .add("activeroutechange", this.onActiveRouteChange, this);

 

 

multiRouteModel.events

.add(["requestsuccess"], this.onModelStateChange, this)

.add("requestsend", this.destroyActiveRouteDescr, this)

;

 

        // Берем текущий активный маршрут.

        this.activeRoute = multiRoute.getActiveRoute();

        //this.makeActiveRouteDescr();

this.getAddressByCoords(beginPlacemark.geometry.getCoordinates());

    }

 

    defineClass(ActiveRouteDescr, {

        // Обработчик смены активного маршрута.

        onActiveRouteChange: function () {

            // Запоминаем новый активный маршрут и создаем описание.

            this.activeRoute = this.multiRoute.getActiveRoute();

this.getAddressByCoords(beginPlacemark.geometry.getCoordinates());

        },

 

onModelStateChange: function (e) {

            // Запоминаем новый активный маршрут и создаем описание.

            this.activeRoute = this.multiRoute.getActiveRoute();

this.getAddressByCoords(beginPlacemark.geometry.getCoordinates());

        },

 

        onMultiRouteUpdate: function () {

            // При обновлении маршрута выполняем построение маршрута заново.

this.getAddressByCoords(beginPlacemark.geometry.getCoordinates());

        },

 

        makeActiveRouteDescr: function () {

            /* Если есть активный маршрут, перебираем все пути маршрута.

               Для каждого пути перебираем все сегменты и для каждого получаем описание

*/   

var result=new Array();

var resultText="";

            if (this.activeRoute) {

if(begAddress)

result.push('

  • A'+begAddress+'>');
  •  

                    this.activeRoute.getPaths().each(function (path) {

                        path.getSegments().each(function (segment) {

                            result.push('

  • '+this.makeDescrSegment(segment)+'
  • ');

                        }, this)

                    }, this);

     

    if(endAddress)

    result.push('

  • B'+endAddress+'>');
  •  

    resultText="

      "+result.join("")+"
    ";

    $('#show-descr-route').show();

                }

    else{

    resultText="Нет маршрутов";

    $('#show-descr-route').hide();

    }

    $('#show-descr-route').html("Показать маршрут");

    $('#viewContainer').html(resultText); 

     

            },

     

    getAddressByCoords:function (coords, callbackFunction){

    var self=this;

    ymaps.geocode(coords).then(function (res) {

    var firstGeoObject = res.geoObjects.get(0);

     

    begAddress=firstGeoObject.properties.get('text');

    self.makeActiveRouteDescr();

    },

    function (err) {

    //Строить описание без начальной точки

    self.makeActiveRouteDescr();

    }

    );

    },

     

            destroyActiveRouteDescr: function (e) {

    if(e.get('params').routingMode!=='masstransit'){

    $('#show-descr-route').html('Запрос данных ...');

    $('.route-container').hide();

    if (this.activeRoute) {

    $('#viewContainer').html('Запрос данных ...');

    }

    }

            },

     

            destroy: function () {

                //this.destroyActiveRouteDescr();

                this.multiRoute.events

                    .remove("update", this.onMultiRouteUpdate, this)

                    .remove("activeroutechange", this.onActiveRouteChange, this);

    multiRouteModel.events

    .remove([ "requestsuccess"], this.onModelStateChange, this)

    .remove("requestsend", this.destroyActiveRouteDescr, this)

    ;

            },

     

     

            makeDescrSegment: function (segment) {

    var street=segment.properties.get("street");

    var text=segment.properties.get("action").text+((street)?", "+street:"")+"
    "+segment.properties.get("distance").text+", "+segment.properties.get("duration").text;

     

    return text;

            }

        });

     

        provide(ActiveRouteDescr);

    });

     

    Есть функция, которая строит описание активного маршрута по всем сегментам makeActiveRouteDescr.

     

    функция getAddressByCoords вызывается по событиям update,activeroutechange, requestsuccess.

    В функции getAddressByCoords  вызвается makeActiveRouteDescr.

    По идее при смене способа перемещения должно сраьатывать событие activeroutechange и перестраиваться описание. 

    На какое событие маршрута нужно вызывать функцию для описания маршрута?

    У сегментов общественного транспорта другая структура данных, там нет action, и этот код падает

    var text=segment.properties.get("action").text+((street)?", "+street:"")+"
    "+segment.properties.get("distance").text+", "+segment.properties.get("duration").text;

    Спасибо.

    Как получить тип сегмента?

    Например, узнать что сегмент имеет тип multiRouter.masstransit.WalkSegment.

     

    Еще http://take.ms/qzt3x - как сделать чтобы по умолчанию был какой-то маршрут активным при выборе маршрута на общественном транспорте?

    Документация не помогает?

     

    type: String - идентификатор типа сегмента, принимающий значение "walk" для пеших сегментов;

     

     

    Спасибо. Теперь понятно.

     

    Еще http://take.ms/qzt3x - как сделать чтобы по умолчанию был какой-то маршрут активным при выборе маршрута на общественном транспорте?

    activeRouteAutoSelection - это значение по умолчанию true.

    Именно при пешем сегменте нет активного маршрута.


    https://maps.yandex.ua/?z=15&ll=37.403255,55.713808&l=map&rtext=55.714343,37.417224~55.711508,37.390187&rtt=mt&origin=jsapi_2_1_29

    При перемещении маркера нет активного маршрута.

    Там полностью пеший маршрут активен, он серого цвета