knockout.js с optionsValue и значение

Есть ли способ сохранить привязку value к объекту, но имеют optionsValue в объекте. На данный момент, если я optionsValue оба, optionsValue свойство optionsValue будет заполнять привязку value. Ид хотел бы сохранить объект в неизменном виде в наблюдаемом, но указать, какое значение должно быть установлено в значении списка выбора. Таким образом, форма submit отправит optionsValue я выбрал.

@Html.DropDownListFor(q => q.DivisionId, new SelectList(Enumerable.Empty<string>()), new { data_bind="options: divisions, optionsText: 'Name', optionsValue: 'Id', value: division, optionsCaption: ' - '" })

function AddCrossPoolGameDialog() {
    var self = this;

    self.divisions = ko.observableArray([]);
    self.division = ko.observable();

    self.awayDivisionTeams = ko.computed(function () {
        var division = ko.utils.arrayFirst(self.divisions(), function(item) {
            return self.division.Name() == item.Name;
        });

        if (division) {
            return division.DivisionTeamPools;
        }

        return [];
    });
}

Ответ 1

Вы не можете заставить обе привязки optionsValue и value указывать на разные объекты, но вы можете создать простую обходную процедуру.

Чтобы получить форму, чтобы отправить простое значение, используйте optionsValue чтобы указать на свойство связанного элемента, которое вы хотите разместить в форме. Затем присвойте привязку value наблюдаемому. Наконец, создайте computed для автоматического поиска и возврата правильного объекта при изменении выбранного значения.

Примеры привязок:

<select data-bind="options: options,
                   optionsText: 'name',
                   optionsValue: 'id',
                   value: selectedOptionId"></select>
<br/>
<br/>
Selection Option Object : <span data-bind="text: selectedOption"></span><br/>
Selection Option name : <span data-bind="text: selectedOption().name"></span><br/>
Selection Option id : <span data-bind="text: selectedOption().id"></span><br/>

и модель просмотра:

var optionModel = function(id,name){
    var self = this;
    self.id = id;
    self.name = name;
}

var viewModel = function(){
    var self = this;
    self.options = [
        new optionModel(1,"First"),
        new optionModel(2,"Second")
    ];
    self.selectedOptionId = ko.observable(self.options[0].id);
    self.selectedOption = ko.computed(function(){
        return ko.utils.arrayFirst(self.options, function(item){
            return item.id === self.selectedOptionId();
        });
    });
}

ko.applyBindings(new viewModel());

Я разместил это в jsFiddle здесь.

Надеюсь это поможет!