Как получить выбранный пункт меню из наблюдаемого массива Knockout.js?

Я чувствую, что мне не хватает чего-то очень простого, но я не могу заставить выпадающее меню работать так, как я ожидаю, используя Knockout.js.

У меня есть набор объектов, которые я хочу представить в меню, и мне нужно найти выбранный вариант и отправить его на сервер. Я могу заставить меню отображаться, но не могу получить значение выбранного элемента. Моя модель представления выглядит так:

function ProjectFilterItem( name, id ) {
    this.Name = name;
    this.Id   = id;
}

function FilterViewModel() {
    this.projectFilters = ko.observableArray([
        new ProjectFilterItem( "foo", "1" ),
        new ProjectFilterItem( "bar", "2" ),
        new ProjectFilterItem( "baz", "3" )
    ]);
    this.selectedProject = ko.observable();
}

ko.applyBindings( new FilterViewModel() );

и моя разметка вида выглядит так:

<select 
    id        = "projectMenu"   
    name      = "projectMenu"
    data-bind = "
        options:        projectFilters,
        optionsText:    'Name', /* I have to enquote the value or I get a JS error */
        optionsValue:   'Id',   /* If I put 'selectedProject here, nothing is echoed in the span below */
        optionsCaption: '-- Select Project --'
    "
></select>

<b>Selected Project:</b> <span data-bind="text: selectedProject"></span>

Как заставить выбранный элемент меню отображаться в диапазоне и отправлять его на сервер? (Я предполагаю, что наблюдаемое, которое я отображаю в диапазоне, такое же, как и то, которое я публикую.) Нужно ли мне другое свойство в ProjectFilterItem, например this.selected = ko.observable(false);? Если да, то как мне объявить его целью значения?


person Val    schedule 05.11.2012    source источник


Ответы (1)


Вам просто нужно использовать с valuebinding для привязки выбранного значения:

Из options документации:

Примечание. Для списка с множественным выбором, чтобы указать, какие параметры выбраны, или прочитать, какие параметры выбраны, используйте привязку selectedOptions. Для списка с одним выбором вы также можете читать и записывать выбранный параметр, используя привязку значения.

В вашем примере:

<select 
    id        = "projectMenu"   
    name      = "projectMenu"
    data-bind = "
        value: selectedProject,
        options:        projectFilters,
        optionsText:    'Name',
        optionsValue:   'Id',
        optionsCaption: '-- Select Project --'
    "
></select>

См. демонстрацию.

person nemesv    schedule 05.11.2012
comment
о! Я пропустил это в документе - я сосредоточился на разделе параметров внизу и прочитал примечание вверху. Спасибо, проблема решена! - person Val; 06.11.2012
comment
Спасибо за демонстрацию, она мне очень помогла! - person WhatsInAName; 22.08.2013