8

非常に基本的なものが欠けているように感じますが、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);ですか?もしそうなら、どのようにそれを値のターゲットとして宣言しますか?

4

1 に答える 1

16

valueバインディングを使用して、選択した値をバインドするだけです。

optionsドキュメントから:

注: 複数選択リストの場合、選択されているオプションを設定したり、選択されているオプションを読み取ったりするには、 selectedOptions バインディングを使用します。単一選択リストの場合、値バインディングを使用して、選択したオプションを読み書きすることもできます。

あなたの例では:

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

デモを参照してください。

于 2012-11-05T21:33:09.883 に答える