2014-03-19 48 views
0

好日子,與非多淘汰賽SelectedOptions選擇

我有一種情況與此類似的對象:

{ 
options: [{},{},{}], //array of objects 
selected: [], //array of selected objects 
multiselect: false, //determine if one or multiple values should be selectable 
} 

我想這個對象的選擇元素綁定在一個模板,如如下:

<select data-bind="selectedOptions: selected, options: options, attr: { multiple: multiselect }"></select> 

我希望在這裏,即使它是一個單一的項目選擇列表,它會將值推入選定的數組。 不幸的是,它會出現一個非多選擇列表selectedOptions不會默認值到數組:

這裏有一個小提琴顯示我的意思: http://jsfiddle.net/LkqTU/15444/

注意,第一個顯示的值是0,直到選擇第一個選擇列表上的選項。

是否可以直接更改此功能?我寧願不必將第一個值與其他JavaScript一起推送到數組中(有些情況下我可能根本不呈現選擇對象,因此必須使用大量邏輯)。 有什麼方法來創造價值:推動/彈出一個數組呢?

希望在編寫自定義綁定或某種類型之前有一些簡單的事情。

+0

我是對的,你想推selectedOption中的每個選定的值? – Akhlesh

回答

0

您可以使用訂閱來保持「選定」與svalue同步。 http://jsfiddle.net/LkqTU/15468/

<div> 
    <select data-bind="value: svalue, options: options"></select> 
    <br /> 
    Items in Array: <div data-bind="text: JSON.stringify(selectedOptions())"></div> 
    Selected Value: <div data-bind="text: svalue"></div> 
</div> 

var ViewModel = function() { 
    var self = this; 
    this.options = [1, 2, 3, 4, 5]; 
    this.selectedOptions = ko.observableArray([]); 
    this.svalue = ko.observable(); 
    this.count = ko.computed(function() { 
    return this.selectedOptions().length; 
    }, this); 

    this.svalue.subscribe(function(new_v) { 
    if (new_v) self.selectedOptions([new_v]); 
    }); 
}; 

ko.applyBindings(new ViewModel()); 
+0

謝謝你坦克的時間來寫回應:) 做選擇多選擇或不是問題然而。當列表是非多選時,它相當於獲取值,仍然將默認選擇存儲到selectedOptions列表中。 –

+1

更新了我的答案。 – huocp

0

我結束了使用自定義綁定處理方案

ko.bindingHandlers.selectedValues = { 
//support an array with single value, for making my life easier. 
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
    var arraystore = ko.unwrap(valueAccessor()); 
    if ($.type(arraystore) != 'array') 
     throw ('Custom Binding -- Wrong data type used with this binding'); 
    var val = ko.observable(arraystore[0]); 
    val.subscribe(function (newval) { 
     arraystore.length = 0; 
     arraystore.push(newval); 
    }); 
    ko.applyBindingsToNode(element, { value: val }); 
} 

}

然後我關掉兩個模板之間。很多額外的工作不幸的是:(