Javascript 选择2更改ajax url

Javascript 选择2更改ajax url,javascript,jquery,knockout.js,jquery-select2,Javascript,Jquery,Knockout.js,Jquery Select2,我正在使用knockout.js和插件。 我正试图根据可观察值更改select2 ajax url。 例如,如果基于某些选择,我对1个url或另一个url进行ajax调用。 下面是一个示例代码: <input type="hidden" data-bind="combobox: { optionsText: 'Name', optionsValue: 'ID', optionsCaption: 'Избери...', sourceUrl: partnerUr

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

<input type="hidden" data-bind="combobox: { optionsText: 'Name', optionsValue: 'ID', optionsCaption: 'Избери...', sourceUrl: partnerUrl }, value: ApplyToSubject" id="ApplyToSubject" name="ApplyToSubject">
我使用定制绑定。 下面是它的代码:

// 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');
    }
};
//文档http://ivaynberg.github.io/select2/
ko.bindingHandlers.combobox={
init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
var obj=valueAccessor(),
allBindings=allBindingsAccessor();
var optionsText=ko.utils.unwrapobbservable(obj.optionsText);
var optionsValue=ko.utils.Unwrapobbservable(obj.optionsValue);
var sourceUrl=ko.utils.unwrapObservable(obj.sourceUrl);
var selectedID=ko.utils.unwrapObservable(allBindings.value);
var模型=对象模型;
var unwrapped=ko.utils.unwrappobservable(对象模型);
$(元素)。选择2({
最小输入长度:3,
formatResult:函数formatResult(结果){
返回result.text;
},
数据:功能(模型){
返回{id:unwrapped[optionsValue](),text:unwrapped[optionsText](),data:unwrapped}
},
initSelection:函数(元素,回调){
如果(展开并选择EDID!==“”){
回调({id:unwrapped[optionsValue](),text:unwrapped[optionsText](),data:unwrapped});
}
},
阿贾克斯:{
安静百万:500,
url:subdirUrl+sourceUrl,
数据类型:“json”,
数据:功能(搜索,页面){
返回{
第页:第页,
搜索:搜索
};
},
结果:功能(数据){
var结果=[];
$.each(data.list、函数(键、值){
push({id:value[optionsValue],text:value[optionsText],data:value});
});
var more=data.paging.currentPage
它适用于不改变的url,但对于需要更新的url,我无法使其工作。
(它似乎保留了传递的第一个url(sourceUrl)。

我终于解决了这个问题

从select2文档中我可以看到, 您应该将字符串或函数传递给ajax url参数。 这就是我所做的
我已经编写了一个函数,返回可观察的值(即url):

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

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

然后,自定义绑定的工作原理与问题中的代码中的工作原理相同,只是做了一个小改动:

...
ajax: {
     url: sourceUrl <- this is the returnUrl function
...
}
。。。
阿贾克斯:{

url:sourceUrl ko.computed仅在方法中的逻辑中使用的任何可观察对象发生更改时触发。因此,如果您的某物、其他某物等都不是可观察的或自己计算的,则它将只返回一个值。在if语句中,变量是可观察的,并且每次t时都会更新ko.computed变量内部值的变化。但是绑定Ajax URL值的习惯,好像保持了初始值,你应该考虑把它放在JSFIDLE上。
<input data-bind="combobox: { ... sourceUrl: $data.returnUrl }, value: ApplyToSubject" type="hidden" >
...
ajax: {
     url: sourceUrl <- this is the returnUrl function
...
}