我的问题是什么时候我将我的Select2与具有Knockout View模型的Multiple捆绑在一起.选择其中一个选项后,数据将第二次丢失
KnockOutCode
- $(window).load(function () {
- ko.bindingHandlers.select2 = {
- init: function (element,valueAccessor,allBindingsAccessor) {
- var obj = valueAccessor(),allBindings = allBindingsAccessor(),lookupKey = allBindings.lookupKey;
- $(element).select2(obj);
- 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');
- }
- };
- ko.applyBindings(new viewmodel());
- function viewmodel() {
- var self = this;
- self.MetricsModel = ko.observableArray([]);
- GetMetrics();
- function GetMetrics() {
- $.ajax({
- url: '/Admin/GetMetrics',type: "POST",dataType: "json",success: function (returndata) {
- self.MetricsModel(returndata);
- },error: function () {
- alert("eRROR GET Applications");
- }
- });
- };
- }
- $("#application-select-metrics").select2();
- }
HTML文件
- <select multiple="multiple" id="application-select-metrics" class="form-control" data-bind="options: MetricsModel,optionsText: 'Metrics_Name',OptionsValue:'Metrics_ID',optionsCaption: 'Choose...',select2: {}"></select>
- @*<select multiple="multiple" id="application-select-metrics" class="form-control">
- <option>1</option>
- <option>2</option>
- <option>3</option>
- <option>4</option>
- <option>5</option>
- </select>*@
请注意,注释部分,即硬编码值有效,它允许我选择多个值,并使用Knockout它第一次工作,我得到一个列表填充,但选择一次后,第二次数据是丢失.
请帮忙,
谢谢,
编辑:
正如Hanes所说,我编辑了代码,并引入了自定义绑定,但它仍然不起作用,我不认为自定义绑定的更新部分工作正常,因为下拉填充一次但无法绑定第二次.任何帮助都将很高兴.
解决方法
@rniemeyer不久前把它扔到了一个JSFiddle上,它可以帮助你:
http://jsfiddle.net/rniemeyer/R8UF5/
他的小提琴,更新
在更新值时,使用以下绑定与几个小提琴相结合:
- ko.bindingHandlers.select2 = {
- init: function(element,allBindingsAccessor) {
- var obj = valueAccessor(),lookupKey = allBindings.lookupKey;
- setTimeout(function() {
- $(element).select2(obj);
- },0);
- if (lookupKey) {
- var value = ko.utils.unwrapObservable(allBindings.value);
- $(element).select2('data',function(item) {
- return item[lookupKey] === value;
- }));
- }
- ko.utils.domNodeDisposal.addDisposeCallback(element,function() {
- $(element).select2('destroy');
- });
- },update: function(element) {
- $(element).trigger('change');
- }
- };