Как передать данные в Яндекс.Карты?

Есть два поля - откуда, куда. При нажатии на кнопку "карта" геокодируется адрес и передаётся в Яндекс.Картах. Но всё не так. Данные передаются только после второго клика.
Да и вообще не могу разобраться с этими картами, всё как-то сумбурно >_<

"Первую" часть кода взял из песочницы API Яндекс.Карт.

UPD: Вводим "Мск" и "Спб", нажимаем - пустая карта. Затем вводим "Краснодар" - "Великий Новгород", нажимаем - показывает маршрут Мск-Спб. И так далее, т.е. показывает предыдущие координаты.

$(document).ready(function () {
    var coordsone,
    coordstwo;

ymaps.modules.define('MultiRouteCustomView', [
    'util.defineClass'
], function (provide, defineClass) {
    // Класс простого текстового отображения модели мультимаршрута.
    function CustomView (multiRouteModel) {
        this.multiRouteModel = multiRouteModel;
        // Объявляем начальное состояние.
        this.state = "init";
        this.stateChangeEvent = null;
        // Элемент, в который будет выводиться текст.
        this.outputElement = $('<div></div>').appendTo('#viewContainer');

        this.rebuildOutput();

        // Подписываемся на события модели, чтобы
        // обновлять текстовое описание мультимаршрута.
        multiRouteModel.events
            .add(["requestsuccess", "requestfail", "requestsend"], this.onModelStateChange, this);
    }

    // Таблица соответствия идентификатора состояния имени его обработчика.
    CustomView.stateProcessors = {
        init: "processInit",
        requestsend: "processRequestSend",
        requestsuccess: "processSuccessRequest",
        requestfail: "processFailRequest"
    };

    // Таблица соответствия типа маршрута имени его обработчика.
    CustomView.routeProcessors = {
        "driving": "processDrivingRoute",
        "masstransit": "processMasstransitRoute"
    };

    defineClass(CustomView, {
        // Обработчик событий модели.
        onModelStateChange: function (e) {
            // Запоминаем состояние модели и перестраиваем текстовое описание.
            this.state = e.get("type");
            this.stateChangeEvent = e;
            this.rebuildOutput();
        },

        rebuildOutput: function () {
            // Берем из таблицы обработчик для текущего состояния и исполняем его.
            var processorName = CustomView.stateProcessors[this.state];
            this.outputElement.html(
                this[processorName](this.multiRouteModel, this.stateChangeEvent)
            );
        },

        processInit: function () {
            return "Инициализация ...";
        },

        processRequestSend: function () {
            return "Запрос данных ...";
        },

        processSuccessRequest: function (multiRouteModel, e) {
            var routes = multiRouteModel.getRoutes(),
                result = ["Данные успешно получены."];
            if (routes.length) {
                result.push("Всего маршрутов: " + routes.length + ".");
                for (var i = 0, l = routes.length; i < l; i++) {
                    result.push(this.processRoute(i, routes[i]));
                }
            } else {
                result.push("Нет маршрутов.");
            }
            return result.join("<br/>");
        },

        processFailRequest: function (multiRouteModel, e) {
            return e.get("error").message;
        },

        processRoute: function (index, route) {
            // Берем из таблицы обработчик для данного типа маршрута и применяем его.
            var processorName = CustomView.routeProcessors[route.properties.get("type")];
            return (index + 1) + ". " + this[processorName](route);
        },

        processDrivingRoute: function (route) {
            var result = ["Автомобильный маршрут."];
            result.push(this.createCommonRouteOutput(route));
            return result.join("<br/>");
        },

        processMasstransitRoute: function (route) {
            var result = ["Маршрут на общественном транспорте."];
            result.push(this.createCommonRouteOutput(route));
            result.push("Описание маршута: <ul>" + this.createMasstransitRouteOutput(route) + "</ul>");
            return result.join("<br/>");
        },

        // Метод формирующий общую часть описания для обоих типов маршрутов.
        createCommonRouteOutput: function (route) {
            return "Протяженность маршрута: " + route.properties.get("distance").text + "<br/>" +
                "Время в пути: " + route.properties.get("duration").text;
        },

        // Метод строящий список текстовых описаний для
        // всех сегментов маршрута на общественном транспорте.
        createMasstransitRouteOutput: function (route) {
            var result = [];
            for (var i = 0, l = route.getPaths().length; i < l; i++) {
                var path = route.getPaths()[i];
                for (var j = 0, k = path.getSegments().length; j < k; j++) {
                    result.push("<li>" + path.getSegments()[j].properties.get("text") + "</li>");
                }
            }
            return result.join("");
        },

        destroy: function () {
            this.outputElement.remove();
            this.multiRouteModel.events
                .remove(["requestsuccess", "requestfail", "requestsend"], this.onModelStateChange, this);
        }
    });

    provide(CustomView);
});



function init () {
    // Создаем модель мультимаршрута.
    var multiRouteModel = new ymaps.multiRouter.MultiRouteModel([
        coordsone,
        coordstwo
    ], {
        // Путевые точки можно перетаскивать.
        // Маршрут при этом будет перестраиваться.
        wayPointDraggable: true,
        boundsAutoApply: true
    });

    // Создаем кнопку, переключающую модель в режим
    // маршрутизации на общественном транспорте.
    var masstransitButton = new ymaps.control.Button({
        data: { content: "На общественном транспорте"},
        options: { selectOnClick: true }
    });

    // Объявляем обработчики для кнопки.
    masstransitButton.events.add('select', function () {
        multiRouteModel.setParams({ routingMode: 'masstransit' }, true);
    });

    masstransitButton.events.add('deselect', function () {
        multiRouteModel.setParams({ routingMode: 'auto' }, true);
    });

    ymaps.modules.require([
        'MultiRouteCustomView'
    ], function (MultiRouteCustomView) {
        // Создаем экземпляр текстового отображения модели мультимаршрута.
        // см. файл custom_view.js
        new MultiRouteCustomView(multiRouteModel);
    });

    // Создаем карту с добавленной на нее кнопкой.
    var myMap = new ymaps.Map('map', {
        center: [55.750625, 37.626],
        zoom: 7,
        controls: [masstransitButton]
    }, {
        buttonMaxWidth: 300
    });

    // Создаем на основе существующей модели мультимаршрут.
    var multiRoute = new ymaps.multiRouter.MultiRoute(multiRouteModel, {
        // Путевые точки можно перетаскивать.
        // Маршрут при этом будет перестраиваться.
        wayPointDraggable: true,
        boundsAutoApply: true
    });

    // Добавляем мультимаршрут на карту.
    myMap.geoObjects.add(multiRoute);
}
/* _______________________________________________________________________________________________________________ */

    // Вот здесь обрабатываем клик (и начинается "вторая" часть кода)
$('#show_fmap').on('click', function (e) {
    e.preventDefault();
    var fromval = $('#dist-from').val(),
        fromcoord = ymaps.geocode(fromval),
        whereval = $('#dist-where').val(),
        wherecoord = ymaps.geocode(whereval);

    fromcoord.then(
        function (res) {
            coordsone = res.geoObjects.get(0).geometry.getCoordinates();
        });

    wherecoord.then(
        function (res) {
            coordstwo = res.geoObjects.get(0).geometry.getCoordinates();
        });

    ymaps.ready(init);
    console.log(coordsone + ' : ' + coordstwo);
});


});


Спасибо заранее ^_^
  • Вопрос задан
  • 1138 просмотров
Пригласить эксперта
Ответы на вопрос 1
forgotten
@forgotten
Руководитель разработки API Яндекс.Карт
.then — асинхронная операция
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы