2013-05-16 30 views
4

我想使用jquery-select2,但我返回具有不同結構的json對象。 我沒有idtext財產,但CodeDescription遠程數據:具有不同屬性的結果對象。如何映射?

<input type="hidden" id="select2Test" name="select2Test" value=""/> 

這一個我的JSON對象:

[{"Code":"20900","Description":"LONDON"}] 

我發現在互聯網上的一些示例代碼(和閱讀文檔),但我似乎並沒有能夠使它發揮作用。 這是我的javascript:

$("#select2Test").select2({ 
    placeholder: "Search City", 
    minimumInputLength: 2, 
    multiple: false, 
    quietMillis: 5000, 
    id: function (item) { return { id: item.Code }; }, 
    ajax: { 
     url: '/Services/FetchCities', 
     dataType: 'json', 
     type: "POST", 
     data: function (term, page) { return { city: term }; }, 
     results: function (data, page) { 
      return { results: data }; 
     } 
    }, 
    // initSelection: function (item, callback) { 
    //  var data = { id: item.Code(), text: item.Description() }; 
    //  callback(data); 
    // }, 
    formatResult: function (item) { return ('<div>' + item.Code + ' - ' + item.Description + '</div>'); }, 
    formatSelection: function (item) { return (item.Description); }, 
    escapeMarkup: function (m) { return m; } 
}).on("change", function() { 
    var $this = $(this); 
    alert($this.val()); 
}); 

我在這裏映射我的唯一關鍵:

id: function (item) { return { id: item.Code }; }, 

格式化我這裏的結果:

formatResult: function (item) { return ('<div>' + item.Code + ' - ' + item.Description + '</div>'); }, 

這裏設置選擇:

formatSelection: function (item) { return (item.Description); }, 

到現在爲止還挺好。一切似乎工作,除非當我嘗試讀取或張貼值我只是得到一個奇怪的結果:[object Object]。 我想這事做的結果功能:

results: function (data, page) { 
    return { results: data }; 
} 

,但我不是100%肯定。

PS:如果我使用ID和文本更改我返回的json對象,一切正常,但我不能這樣做,導致我的代碼的其他部分使用不同的引用。

任何幫助,將不勝感激。

UPDATE

我已經找到了解決方案的數據映射對象:

results: function (data, page) { 
    return { 
     results: $.map(data, function (item) { 
      return { 
      id: item.Code, 
      text: item.Description 
      }; 
     }) 
    }; 
} 

這個變化我並不需要設置id屬性:

// id: function (item) { return { id: item.Code }; }, 

formatResultformatSelection

formatResult: function (item) { return ('<div>' + item.id + ' - ' + item.text + '</div>'); }, 
formatSelection: function (item) { return (item.text); }, 

不需要改變。

我在想這是不是最好的選擇。

回答

1

我已經找到了解決方案的數據映射對象:

results: function (data, page) { 
    return { 
     results: $.map(data, function (item) { 
      return { 
      id: item.Code, 
      text: item.Description 
      }; 
     }) 
    }; 
} 

這個變化我並不需要設置id屬性:

// id: function (item) { return { id: item.Code }; }, 

formatResultformatSelection

formatResult: function (item) { return ('<div>' + item.id + ' - ' + item.text + '</div>'); }, 
formatSelection: function (item) { return (item.text); }, 

不需要改變。

+0

您是否還需要'data:function(term,page){return {city:term};一旦你在'results'中使用了映射,你的代碼中的'','','? – Marklar

+0

是的,你需要這個,因爲我正在發送城市參數給我的行爲。 – LeftyX

0

我也不是很明白你的問題,但如果你需要的是你的對象映射到一個選擇2兼容的對象,我會說,你可以這樣做:

// Usage: select2Map({Code: '123', Description: 'asd'}) => { id: '123', text: 'asd' } 
var select2Map = function(object){ 
    return {id: object.Code, text: object.Description}; 
} 

,利用此功能像這樣:

results: function (data, page) { 
    return { results: select2Map(data) }; 
} 

你可以試試看,我沒有測試過它。

+0

恐怕它不工作。我已經更新了我的問題,因爲我找到了解決方案。不過,我不知道這是否是最好的,也是最快的。 – LeftyX

+1

好吧,那很好,我不知道'data'是一個項目的集合。 – juanpastas

2

我碰到這個問題也來了,和最新的插件V4.0.0 這並不工作,所以我所做的是以下

... , 
processResults: function (data) { 
    //where data._embedded.people is the array containing all my objects 
    data = $.map(data._embedded.people, function (obj) { 
      obj.id = obj.id || obj.ID; 
      return obj; 
    }); 

    return { 
     results: data 
    }; 
}, 
... 

我發現的文檔 https://select2.github.io/announcements-4.0.html#changed-id

在回答希望這有助於:)

相關問題