select2更改ajaxurl

我正在使用knockout.js和select2插件。
我试图根据一个observable的值更改select2 ajax url。
例如,如果基于某些选择我执行ajax调用1 url或另一个。 这是一个示例代码:

 

这是检索sourceUrl:partnerUrl的方式:

 self.partnerUrl = ko.computed(function () { var value = ""; if (something) { value = apiUrls.customer; } else if (something else) { value = apiUrls.vendor; } else if(or another thing) { value = apiUrls.employee; } return value; }); 

我使用自定义绑定。 这是它的代码:

 // documentation http://ivaynberg.github.io/select2/ ko.bindingHandlers.combobox = { init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { var obj = valueAccessor(), allBindings = allBindingsAccessor(); var optionsText = ko.utils.unwrapObservable(obj.optionsText); var optionsValue = ko.utils.unwrapObservable(obj.optionsValue); var sourceUrl = ko.utils.unwrapObservable(obj.sourceUrl); var selectedID = ko.utils.unwrapObservable(allBindings.value); var model = obj.model; var unwrapped = ko.utils.unwrapObservable(obj.model); $(element).select2({ minimumInputLength: 3, formatResult: function formatResult(result) { return result.text; }, data: function (model) { return { id: unwrapped[optionsValue](), text: unwrapped[optionsText](), data: unwrapped } }, initSelection: function (element, callback) { if (unwrapped && selectedID !== "") { callback({ id: unwrapped[optionsValue](), text: unwrapped[optionsText](), data: unwrapped }); } }, ajax: { quietMillis: 500, url: subdirUrl + sourceUrl, dataType: 'json', data: function (search, page) { return { page: page, search: search }; }, results: function (data) { var result = []; $.each(data.list, function (key, value) { result.push({ id: value[optionsValue], text: value[optionsText], data: value }); }); var more = data.paging.currentPage < data.paging.pageCount; return { results: result, more: more }; } } }); $(element).on('select2-selected', function (eventData) { if (eventData.choice) { // item selected var selectedItem = eventData.choice.data; var selectedId = eventData.choice.id; model(selectedItem); } else { model(undefined); } }); ko.utils.domNodeDisposal.addDisposeCallback(element, function () { $(element).select2('destroy'); }); }, update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { var obj = valueAccessor(), allBindings = allBindingsAccessor(); var selectedID = ko.utils.unwrapObservable(allBindings.value); $(element).val(selectedID).trigger('change'); } }; 

它适用于不改变的url,但对于需要更新的url,我无法使其正常工作。 (看起来它保留了传递的第一个url(sourceUrl)。

我终于设法解决了这个问题。

根据我从select2文档中读到的内容,您应该将字符串或函数传递给ajax url参数。 所以这就是我所做的
我编写了一个函数来返回observable的值(这是url):

 self.returnUrl = function () { return self.dynamicUrl(); }; 

然后我将该函数传递给我的自定义绑定选项:

  

然后自定义绑定的工作方式与问题中的代码相同,只需稍加改动:

 ... ajax: { url: sourceUrl <- this is the returnUrl function ... }