gpt4 book ai didi

javascript - select2 更改 ajax url

转载 作者:行者123 更新时间:2023-11-29 10:14:31 24 4
gpt4 key购买 nike

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

<input type="hidden" data-bind="combobox: { optionsText: 'Name', optionsValue: 'ID', optionsCaption: 'Избери...', sourceUrl: partnerUrl }, value: ApplyToSubject" id="ApplyToSubject" name="ApplyToSubject">

这是 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;
});

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

// 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 参数。所以这就是我所做的
我编写了一个返回可观察值(即 url)的函数:

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

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

<input data-bind="combobox: { ... sourceUrl: $data.returnUrl }, value: ApplyToSubject" type="hidden" >

然后自定义绑定(bind)的工作方式与问题中的代码相同,只是有一个小的变化:

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

关于javascript - select2 更改 ajax url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25490659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com