1

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

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

+0

Упс, вы можете создавать обычай jqxDropDownList bindingHandler вы используете? – br4d

+0

Обновлен код –

+0

О, я вижу ... этот jqxknockout, который вы используете, содержит пользовательские bindHandlers. Похоже, что они поддерживают только настройку выбранного значения по индексу, поэтому вам нужно будет написать вычисленную функцию, чтобы получить индекс – br4d

ответ

0

Похоже, 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/

+0

Спасибо, прежде чем пометить его как ответ, не могли бы вы взглянуть на эту фрикку, я могу получить правильное связывание друг с другом: http://jsfiddle.net/euto6vmj/2/ они должны иметь такое же поведение, как и предыдущее '