2016-06-13 76 views
0

有这个jsfiddle http://jsfiddle.net/gauldivic/wLrhrno9/这是接近我想要的。它有optgroups,但我似乎无法弄清楚如何设置值使用optgroup设置选择值knockoutjs

JS

ko.bindingHandlers.option = { 
    update: function(element, valueAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     ko.selectExtensions.writeValue(element, value); 
    }   
}; 

function Group(label, children) { 
    this.label = ko.observable(label); 
    this.children = ko.observableArray(children); 
} 

function Option(label, property) { 
    this.label = ko.observable(label); 
    this.someOtherProperty = ko.observable(property); 
} 

var ViewModel = function() { 
    this.groups = ko.observableArray([ 
     new Group("Group 1", [ 
      new Option("Option 1", "A"), 
      new Option("Option 2", "B"), 
      new Option("Option 3", "C") 
     ]), 
     new Group("Group 2", [ 
      new Option("Option 4", "D"), 
      new Option("Option 5", "E"), 
      new Option("Option 6", "F") 
     ]) 
    ]); 

    this.selectedOption = ko.observable(); 

    this.specialProperty = ko.computed(function(){ 
     var selected = this.selectedOption(); 
     return selected ? selected.someOtherProperty() : 'unknown'; 
    }, this); 
}; 

ko.applyBindings(new ViewModel()); 

HTML

<select data-bind="foreach: groups, value: selectedOption"> 
<option></option> 
<optgroup data-bind="attr: {label: label}, foreach: children"> 
    <option data-bind="text: label, option: $data"></option> 
</optgroup> 


我知道这是哪里设置选定的选项,但我似乎无法弄清楚如何让它工作。 this.selectedOption = ko.observable(); 此外,这将与多个选择在同一页面上工作? 我将使用这个数据库,我想能够预先选择的选项。

回答

0

我可以让它工作:http://jsfiddle.net/brianlmerritt/3m67L5h0/

<select data-bind="foreach: groups, value: selectedOption"> 
    <!--<option data-bind="text:$index()+1"></option>--> 
    <optgroup data-bind="attr: {label: label}, foreach: children"> 
     <option data-bind="text: label, option: value()"></option> 
    </optgroup> 
</select> 


<hr /> 

<div data-bind="text: specialProperty"></div> 

我不知道什么的第一个选项是为 - 你可以把它放回,如果你想通过取消注释它。该选项的值有

注意要与括号,因为它是可观察的

小的变化,以视图模型

ko.bindingHandlers.option = { 
    update: function(element, valueAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     ko.selectExtensions.writeValue(element, value); 
    }   
}; 

function Group(label, children) { 
    this.label = ko.observable(label); 
    this.children = ko.observableArray(children); 
} 

function Option(label, property) { 
    this.label = ko.observable(label); 
    this.value = ko.observable(property); 
} 

var ViewModel = function() { 
    this.groups = ko.observableArray([ 
     new Group("Group 1", [ 
      new Option("Option 1", "A"), 
      new Option("Option 2", "B"), 
      new Option("Option 3", "C") 
     ]), 
     new Group("Group 2", [ 
      new Option("Option 4", "D"), 
      new Option("Option 5", "E"), 
      new Option("Option 6", "F") 
     ]) 
    ]); 

    this.selectedOption = ko.observable(); 

    this.specialProperty = ko.computed(function(){ 
     var selected = this.selectedOption(); 
     return selected ? selected : 'unknown'; 
    }, this); 
}; 

ko.applyBindings(new ViewModel()); 

我改名为特殊其他变量的价值,所以你可以看到它被设置。

最后,您不需要在您的specialProperty中调用.someOtherProperty()或.value(),因为observable将始终设置为该值。

+0

我刚刚发现我把错误的小提琴。 http://jsfiddle.net/gauldivic/wLrhrno9/2/是正确的小提琴。该索引是我自己测试的东西。我想我的问题是在这种情况下this.selectedOption = ko.observable();我会怎么把那里选择的选项 –

+0

我提出的小提琴设置值并检索它。我没有看到两个小提琴之间的任何差异,使我的答案不起作用。我正在设置this.selectedOption的值,并通过this.specialProperty根据这两个小提琴进行检索。如果您需要提醒它何时更改,请使用'this.selectionOption.subscribe' – brianlmerritt

+0

http://knockoutjs.com/documentation/observables.html – brianlmerritt