Javascript 选择2个选定标记作为对象,而不是';id';淘汰赛

Javascript 选择2个选定标记作为对象,而不是';id';淘汰赛,javascript,asp.net-mvc-4,knockout.js,jquery-select2,Javascript,Asp.net Mvc 4,Knockout.js,Jquery Select2,因此,我有一个select2标签输入可以正常工作,正确显示标签,并将所选id存储到selectedProducts observableArray中。但是,我的HTTPPost需要一个对象数组,而不是整数数组。 我一直在寻找如何将select2另存为对象(即{id:1,text:“abc”}),而不仅仅是一个整数数组 我的装订如下: <div class="col-sm-10"> <input type="hidden" id="tags" class="select2

因此,我有一个select2标签输入可以正常工作,正确显示标签,并将所选id存储到selectedProducts observableArray中。但是,我的HTTPPost需要一个对象数组,而不是整数数组。 我一直在寻找如何将select2另存为对象(即{id:1,text:“abc”}),而不仅仅是一个整数数组

我的装订如下:

<div class="col-sm-10">
    <input type="hidden" id="tags" class="select2 form-control" multiple="multiple" data-bind="value: selectedProducts, select2: {tags: ko.toJS($parent.availableProducts), placeholder: 'select products'}" />
    <pre data-bind="text: ko.toJSON(products, null, 2)"></pre>   
</div>           

var newItem = function (newitem) {
    var self = this;

    self.id = ko.observable();  
    self.selectedProducts = ko.observableArray();
    self.products = ko.computed(function () {
        return self.selectedProducts().split(',');
    }, self);
}       

var viewModel = function (data) {
    var self = this;
    self.newitem= ko.observable(new newItem());    
    self.availableProducts = ko.observableArray([]);      
    $.ajax({
        type: "GET",
        url: '/GetAllProducts',
        dataType: 'json',
        contentType: "application/json; charset=utf-8",
        async: false,
        success: function (data) {
            ko.mapping.fromJS(data, {}, self.availableProducts);
        },
        error: function (err) {
            alert(err.status + " : " + err.statusText);
        }
    });       
}
ko.bindingHandlers.select2 = {
    init: function (element, valueAccessor, allBindingsAccessor) {
        var obj = valueAccessor(),
          allBindings = allBindingsAccessor(),
          lookupKey = allBindings.lookupKey;

        setTimeout(function () {
            $(element).select2(obj);
        }, 0);

        if (lookupKey) {
            var value = ko.utils.unwrapObservable(allBindings.value);
            $(element).select2('data', ko.utils.arrayFirst(obj.data.results, function (item) {
                return item[lookupKey] === value;
            }));
        }

        ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
            $(element).select2('destroy');
        });
    },
    update: function (element) {
        $(element).trigger('change');
    }
}

var newItem=函数(newItem){
var self=这个;
self.id=ko.observable();
self.selectedProducts=ko.observableArray();
self.products=ko.computed(函数(){
返回self.selectedProducts().split(',');
},自我);
}       
var viewModel=函数(数据){
var self=这个;
self.newitem=ko.observable(newnewitem());
自可用产品=可观测的可观测日([]);
$.ajax({
键入:“获取”,
url:“/GetAllProducts”,
数据类型:“json”,
contentType:“应用程序/json;字符集=utf-8”,
async:false,
成功:功能(数据){
fromJS(数据,{},self.availableProducts);
},
错误:函数(err){
警报(err.status+:“+err.statusText);
}
});       
}
ko.bindingHandlers.select2={
init:function(元素、valueAccessor、allBindingsAccessor){
var obj=valueAccessor(),
allBindings=allBindingsAccessor(),
lookupKey=allBindings.lookupKey;
setTimeout(函数(){
$(元素)。选择2(对象);
}, 0);
如果(查找键){
var value=ko.utils.unwrapobbservable(allBindings.value);
$(元素)。选择2('data',ko.utils.arrayFirst(obj.data.results,函数(项)){
返回项[查找键]==值;
}));
}
ko.utils.domNodeDisposal.addDisposeCallback(元素,函数(){
$(元素)。选择2('destroy');
});
},
更新:功能(元素){
$(元素).trigger('change');
}
}

select2正在包装表单字段,因此无法直接发布JSON对象。如果可以的话,修改服务器端代码以使用IDs可能是最简单的

如果没有,您可以在select2构造函数中使用
id
参数,并返回您在服务器上解析的字符串化JSON对象。例如,
数据绑定中的(未测试):

select2: {
    tags: ko.toJS($parent.availableProducts),
    placeholder: 'select products',
    id: function(product) { return JSON.stringify({server_id: product.id, server_text: product.text}) }
}
有关此方法的更多信息:


也许在将来我们会有。

很有意义-听起来只要让我的服务器端代码用户ID就更容易了。谢谢你的澄清