jqxDropDownList с нокаутом не может связать выбранное значение

Я пытаюсь связать выбранное значение jqxDropDownList с ko.observable и не могу понять, что не так. Он работает с обычными тегами <select> и не работает с элементом <div>, как показано ниже в HTML-коде. Мне нужно заменить <select> на раскрывающийся список jqwidgets и привязать соответственно, как указано в рабочем коде.

ViewModel:

var viewModel = function(){
    var self = this;
    self.patternSelectedIndex = ko.observable(0);
    self.windowSelectedIndex = ko.observable(0);
    self.colorSelectedIndex = ko.observable(0);
    self.hardwareSelectedIndex = ko.observable(0);
    self.selectedMake = ko.observable();
    self.selectedType = ko.observable();

    self.makes = [
            {id:1, name: 'Northwoods Prestige', dimensions:true},
            {id:2, name: 'Forest Bay', dimensions:true},
            {id:3, name: 'Timberland', dimensions:true}
    ];
    self.types = [
            {id: 1, make:1, name:'Special Reserve 138', patterns:[{file:'FB_Classic', name:'FB Clasic'},{file:'FB_Long', name:'FB Long'},{file:'FB_Flush', name:'FB Flush'}], colors:[{file:'Brown', name:'Brown'},{file:'Oak', name:'Oak'},{file:'Cherry', name:'Cherry'},{file:'Green', name:'Green'}], windows:[{file:'Cascade', name:'Cascade'},{file:'LongPanel', name:'LongPanel'},{file:'Plain', name:'Plain'},{file:'Savanna', name:'Savanna'},{file:'Sunburst', name:'Sunburst'},{file:'Sherwood', name:'Sherwood'}], hardware:[{file:'hardware1', name:'Strap Hinge'},{file:'hardware2', name:'Door Stud'},{file:'hardware3', name:'Lift Handle'}]},
            {id: 2, make:1, name:'Special Reserve II', patterns:[{file:'SR_81', name:'SR 81'}], colors:[{file:'Almond', name:'Almond'},{file:'White', name:'White'}], windows:[{file:'Heritage', name:'Colonial'},{file:'Cascade', name:'Cascade'}], hardware:[{file:'hardware1', name:'Strap Hinge'},{file:'hardware3', name:'Lift Handle'}]},
            {id: 3, make:2, name:'TF 138', patterns:[{file:'Rec_Carraige', name:'Rec Carraige'}], colors:[{file:'Green', name:'Green'}, {file:'Sepia', name:'Sepia'}], windows:[{file:'Cathedral', name:'Cathedral'},{file:'Cascade', name:'Cascade'}], hardware:[{file:'hardware1', name:'Strap Hinge'},{file:'hardware3', name:'Lift Handle'}]},
            {id: 4, make:2, name:'TF II', patterns:[{file:'Raised_Carriage', name:'Raised Carriage'}], colors:[{file:'Almond', name:'Almond'}], windows:[{file:'Cathedral', name:'Cathedral'},{file:'Cascade', name:'Cascade'}], hardware:[{file:'hardware1', name:'Strap Hinge'},{file:'hardware3', name:'Lift Handle'}]},
            {id: 5, make:3, name:'RP 25', patterns:[{file:'FB_Classic', name:'FB Classic'}], colors:[{file:'Cherry', name:'Cherry'}], windows:[{file:'Cathedral', name:'Cathedral'},{file:'Cascade', name:'Cascade'}], hardware:[{file:'hardware1', name:'Strap Hinge'},{file:'hardware3', name:'Lift Handle'}]},
            {id: 6, make:3, name:'LP 25', patterns:[{file:'FB_Long', name:'FB Long'}], colors:[{file:'Green', name:'Green'}], windows:[{file:'Cathedral', name:'Cathedral'},{file:'Cascade', name:'Cascade'}], hardware:[{file:'hardware1', name:'Strap Hinge'},{file:'hardware3', name:'Lift Handle'}]}
    ];
    self.doorTypes = ko.computed(function(){
        return ko.utils.arrayFilter(self.types, function(item){
            return item.make === self.selectedMake();
        });
    });
    self.matchingTypes = ko.computed(function () {
        return ko.utils.arrayFilter(self.doorTypes(), function (item, index) {
            return item.id === self.selectedType();
        });
    }); 
};
var model = new viewModel();
ko.applyBindings(model);

(не работает): в приведенной ниже разметке нет возможности привязать значение к selectedMake, как в рабочем примере *2.

<div id="make" data-bind="jqxDropDownList: {source: makes, autoDropDownHeight: true, height: 25, width: 200, displayMember : 'name'}"></div>

2* HTML (рабочий):

<select id="make" class="form-control select pull-left" data-bind="options: makes, value: selectedMake, optionsText : 'name', optionsValue : 'id'"></select>

Пожалуйста, взгляните: jsfiddle.net/euto6vmj


person Diego P    schedule 29.06.2015    source источник
comment
Упс, можете ли вы опубликовать пользовательский обработчик привязки jqxDropDownList, который вы используете?   -  person Brad C    schedule 29.06.2015
comment
О, я вижу... этот jqxknockout, который вы используете, содержит настраиваемые обработчики связывания. Похоже, они поддерживают только установку выбранного значения по индексу, поэтому вам придется написать вычисляемую функцию, чтобы получить индекс   -  person Brad C    schedule 29.06.2015
comment
взгляните: jsfiddle.net/euto6vmj   -  person Diego P    schedule 29.06.2015
comment
Фиддл очень помогает. Итак, вы хотите, чтобы он был выбран как для производителя, так и для типа?   -  person Brad C    schedule 29.06.2015
comment
Правильно, для обоих   -  person Diego P    schedule 29.06.2015
comment
Проверьте обновленный ответ (и ссылку на скрипку внутри).   -  person Brad C    schedule 29.06.2015


Ответы (1)


Похоже, что jqxknockout поддерживает выбор элементов только по индексу массива, поэтому вам нужно будет добавить функцию, которая захватывает текущий выбранный индекс. Вот две функции, которые синхронизируются с наблюдаемыми объектами selectedMake и selectedType для получения выбранного индекса:

self.selectedMakeIndex = ko.computed(function() { 
    return self.makes.map(function(e) { return e.id; }).indexOf(self.selectedMake());
});

self.selectedTypeIndex = ko.computed(function() { 
    return self.types.map(function(e) { return e.id; }).indexOf(self.selectedType());
});

Каждый раз, когда вы устанавливаете наблюдаемые для selectedMake(), они автоматически обновляются. Просто используйте его в своей привязке данных:

<div id="make" data-bind="jqxDropDownList: {source: makes, autoDropDownHeight: true, height: 25, width: 200, displayMember : 'name', selectedIndex: selectedMakeIndex }"></div>

... и аналогичные по типу.

обновленный jsfiddle: http://jsfiddle.net/euto6vmj/1/

person Brad C    schedule 29.06.2015
comment
Спасибо, прежде чем я отмечу это как ответ, не могли бы вы взглянуть на этот friddle, я могу правильно связать dropdoewn друг с другом: jsfiddle.net/euto6vmj/2 они должны вести себя так же, как и предыдущие <select> - person Diego P; 30.06.2015
comment
Да, я думаю, вам придется использовать jqxDataAdapter, так как он не позволяет указать отдельное значение/optionsValue, как в старом простом нокауте. В адаптере данных вам нужно подключить его, чтобы selectedMake() правильно заполнялся - person Brad C; 30.06.2015