如何从knockout.js observableArray中获取所选菜单选项?

Val*_*Val 7 select option knockout.js drop-down-menu

我觉得我错过了一些非常基本的东西,但我无法使用下拉菜单来工作,因为我期望使用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() );
Run Code Online (Sandbox Code Playgroud)

我的视图标记看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

如何让选定的菜单项显示在范围内,并发布到服务器?(我假设我在跨度中渲染的可观察对象与我发布的相同.)我是否需要另一个属性ProjectFilterItem,比如this.selected = ko.observable(false);?如果是这样,我将如何将其声明为值的目标?

nem*_*esv 15

您只需使用value绑定绑定选定的值:

options文档:

注意:对于多选列表,要设置选择了哪个选项,或者要读取选择了哪个选项,请使用 selectedOptions绑定.对于单选列表,您还可以使用值绑定读取和写入所选选项.

在你的例子中:

<select 
    id        = "projectMenu"   
    name      = "projectMenu"
    data-bind = "
        value: selectedProject,
        options:        projectFilters,
        optionsText:    'Name',
        optionsValue:   'Id',
        optionsCaption: '-- Select Project --'
    "
></select>
Run Code Online (Sandbox Code Playgroud)

演示.