0

フォームをサーバーにポストし、asp.net mvc が値を知る必要があるため、選択オプションに値が必要です。「値」をバインドしてオブジェクトのインスタンスに設定すると、他のバインディングが選択したオブジェクトの値から読み取られるため、これを実行したい場合、オプションには html 値属性がありません。value 属性は、フォームが送信されるときに必要なものです。optionsValue を設定してアイテムの ID を指すと、値バインディングがオーバーライドされ、バインドしたプロパティがオブジェクトにないというエラーが発生します。

計算型の読み取り/書き込みオプションを使用してこれを設定できますが、もっと簡単な方法がないかどうか疑問に思っていました。

ありがとう、

オプションには値がありません。

 <select data-bind="options: $root.meetingEvents,
                    value: $data.meetingEvent,
                    optionsText: 'meetingEventName',
                    optionsCaption: ' '">

オプションには値がありますが、選択すると、値にプッシュされるのは meetingEventId であるため、他のコントロールがバインドされている他のプロパティはありません。

<select data-bind=" options: $root.meetingEvents,
                    value: $data.meetingEvent,
                    optionsText: 'meetingEventName',
                    optionsValue: 'meetingEventId'
                    optionsCaption: ' '">
4

3 に答える 3

0

これは、このバインド機能をノックアウトに追加する必要があるもう 1 つの大きな理由です。値オブジェクトにバインドするか、valueOption にバインドするかの選択に制限されるべきではありません。

あなたはすでに計算された観測可能なアプローチをリストしましたが、私はおそらくそれを採用します。optionsValue バインディングを使用して開き、選択したオブジェクトを保持する計算オブザーバブルを追加します

また、さらに精力的なことをして、フォーム送信時にコールバックを登録し、値を動的に挿入して、投稿の一部にすることもできます...

于 2013-06-12T03:09:18.370 に答える
0

私は少し異なるアプローチを取ります。meetingEventId および meetingEvent プロパティをオブザーバブルとして保持しますが、meetingEventId が変更されたときに meetingEvent を更新するサブスクリプションを meetingEventId に追加します。

HTML

    <select data-bind=" options: $root.meetingEvents,
                value: $data.meetingEventId,
                optionsText: 'meetingEventName',
                optionsValue: 'meetingEventId'
                optionsCaption: ' '">

Javascript

this.meetingEventId = ko.observable('');
this.meetingEvent = ko.observable(null);

this.meetingEventId.subscribe(function(){
    var meetingEventId = this.meetingEventId();
    var meetingEvent = ko.utils.arrayFirst(vm.meetingEvents(), function (item) {
        return meetingEventId === item.meetingEventId();
    });

    this.meetingEvent(meetingEvent);        
});
于 2013-06-14T02:36:43.473 に答える
0

最後に、計算された新しいオブザーバブルを追加し、値が入ったら、配列からアイテムを見つけて、ビューモデルに手動で設定しました。

<select data-bind=" options: $root.meetingEvents,
                    value: $data.meetingEventId,
                    optionsText: 'meetingEventName',
                    optionsValue: 'meetingEventId'
                    optionsCaption: ' '">

//ビューモデルに追加

 this.meetingEventId = ko.computed({
                    write: function (value) {
                        var meetingEvent = ko.utils.arrayFirst(vm.meetingEvents(), function (item) {
                            return value === item.meetingEventId();
                        });

                        this.meetingEvent(meetingEvent);
                    },
                    read: function() {
                        return this.meetingEvent() ? this.meetingEvent().meetingEventId : "";
                    },
                    owner: this
                });
于 2013-06-12T15:21:53.963 に答える