Клуб API Карт

Выбранный элемент по умолчанию в listBox

Пост в архиве.

Друзья, помогите пжлста серверному разработчику.

Задача: Есть выпадающий список услуг,  у услуги в data записан id который при выборе передается аяксом и на карте отрисовываются плейсмарки фирм, оказывающих соответствующую услугу. Вопрос: как при загрузке карты и формировании listBoxItems указать что какой то элемент должен быть выбран и имитировать клик по нему.

// В цикле заполняются итемсы

listBoxItems.push(new ymaps.control.ListBoxItem({

                            data:

                                    {

                                        content: '<?php echo $service['name']; ?>',

                                        id: <?php echo $service['index']; ?>

                                    },

                        }, {

                            layout: serviceItemSelectorLayout

                        })

);


// Список

serviceSelector = new ymaps.control.ListBox(

                            {

                                data:

                                        {

                                            title: 'Выберите услугу'

                                        },

                                items: listBoxItems

                            },

                    {

                        position: top: 0, left: 5 },

                        layout: serviceSelectorLayout,

                        expandOnClick: false

                    });

 

 

В документации максимум что я нашел, это state, но я не понимаю куда и как его запихивать...Поиск тоже ничего не дал...

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

Не надо ничего и никуда запихивать. ))

Вы же на сервере не запихиваете.

Берем листбокс и выбираем в нем, например, 1-й элемент:

myListBox.get(1).select();

После добавления listBox в контролы, разместил указанный вами код. Эффекта никакого. Список не пустой, в консоле ошибок нет.

Что происходит при выборе пункта из списка?

У вас есть обработчик события клика/выбора пункта?

Код: 

serviceSelector = new ymaps.control.ListBox(

                            {

                                data: {title: 'Выберите услугу'},

                                items: listBoxItems

                            },

                    {

                        position: {top: 0,left: 5},

                        layout: serviceSelectorLayout,

                        expandOnClick: false

                    });

                    myMap.controls.add(serviceSelector);

                    serviceSelector.events.add('click', function(e) {

                        $('#services_list').toggle();

                        var item = e.get('target');

                        if (item !== serviceSelector) {

                            if ($('#btn_show_all:visible').length) {

                                $('#btn_show_all').click();

                            }

                            serviceSelector.data.set('title', item.data.get('content'));

                            myMap.geoObjects.remove(collectionPlacemark);

                            collectionPlacemark = getPlacemarksByStructureId(item.data.get('id'));

                            myMap.geoObjects.add(collectionPlacemark);

                        }

                    });

Когда выбираем услугу, то просто получаем новые плейсмарки, старые удаляем, новые показываем. Если не была нажата кнопка btn_show_all(после нажатия она прячется), то имитируем клик по ней. serviceSelector.get(1).select() размещал и до и после myMap.controls.add(serviceSelector).

Надо подписаться на 'select' вместо 'click',

тогда не надо будет делать проверку item !== serviceSelector,

т.е. if можно выбросить, и будет работать тот код, что я давал

 

 

Заменил клик на селект, проверку убрал. Список вообще не ракрывается, что вроде как логично.

Лейаут самого списка взял из документации. 

serviceSelectorLayout = ymaps.templateLayoutFactory.createClass(

                            '' +

                            '$[data.title]' +

                            '

    ' +

                            '',

                            {

                                build: function() {

                                    serviceSelectorLayout.superclass.build.call(this);

                                    this.childContainerElement = $('#services_list').get(0);

                                    this.events.fire('childcontainerchange', {

                                        newChildContainerElement: this.childContainerElement,

                                        oldChildContainerElement: null

                                    });

                                },

                                getChildContainerElement: function() {

                                    return this.childContainerElement;

                                }

                            });

ну т.е. работает как надо?

Нет, список должен раскрываться. Все наоборот не как надо.

Он у Вас сейчас при клике на него не раскрывается или при вызове метода select() ?

Дайте ссылку.

Не раскрывается при клике. Ссылку получится дать только  завтра с утра. Давайте еще раз на словах расскажу что должно быть. Есть php интерфейс для формирования карты на странице компании. На этой карте по умолчанию отмечена только компания со страницы. Есть кнопка "#btn_show_all" ,  которая при нажатии пропадает и на карте отображается N-ое количество других компании, ранжированных по условному рейтингу. Есть выпадающий список с услугами, которые потенциально могут оказывать компании. Выбираю в списке услугу, и на карте остается N-ое количество компаний, оказывающих данную услугу. 

Вообщем-то это все работает. Что еще нужно:

В php интерфейсе может быть  указан параметр 'serviceSelected' => 'id Услуги'. При таком варианте карта должна загрузится с выбранной по id услугой

Посмотрите ошибки в консоли браузера.

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

Ошибок в консоле нет, я же говорил.

http://fitness.profosfera.ru/firms.php?i=3184&open=map

У меня твой список раскрывается и работает.

У меня тоже работает. Там стоит событие селект. А если менять его на клик, то не работает.

Так оставьте селект. Зачем нужен клик

Прошу прощения, оговорился. У меня стоит клик и все работает. Вы мне порекомендовали сделать селект, чтобы работал код listBox.get(x).select(). Так вот селект не работает, список вообще не раскрывается, ошибок в консоле нет.