Select2小部件将param.term空格发送到ajax作为" +"而不是%20

时间:2017-02-02 15:26:08

标签: javascript ajax drop-down-menu select2 encodeuricomponent

我正在开发一个连接到SAP服务层的应用,并通过网址(API REST)进行查询。我正在使用famouse widget select2,但我遇到了问题。我需要对api进行查询,其句子有空格字符(""):

"(startswith(CardCode,'"+params.term+"') or startswith(CardName,'"+params.term+"'))

这些空间是"或"周围的空间。操作

所以这是mi代码:

$('#buscarCliente').select2({
        placeholder: "Ingrese código o descripción del cliente",
        allowClear: true,
        language: "es",

        ajax: {
            url: SLServer+"BusinessPartners",
            crossDomain: true,
            xhrFields: {
                        withCredentials: true
            },
            dataType: 'json',
            type: 'GET',
            delay: 550,
            params: {
                contentType: 'application/raw; charset=utf-8'
            },
            data: function (params) {
              return {

                $filter: "(startswith(CardCode,'"+params.term+"') or startswith(CardName,'"+params.term+"'))", // Como se va hacer la busqueda
                $orderby : "cardName",
                //contentType: 'multipart/form-data;boundary=<Boundary>',

                //$filter: "((startswith(CardName,'" + params.term.toUpperCase() + "') or startswith(CardCode,'" + params.term.toUpperCase() + "') or startswith(CardName,'" + params.term + "') or startswith(CardCode,'" + params.term + "')) and CardType eq 'C')&$top=15&$expand=PaymentTermsType",
                //$filter: "startswith(CardName,'" + params.term.toUpperCase() + "') or startswith(CardCode,'" + params.term.toUpperCase() + "')",
                page: params.page
              };
            },

            processResults: function (data, params) {
            // parse the results into the format expected by Select2
            // since we are using custom formatting functions we do not need to
            // alter the remote JSON data, except to indicate that infinite
            // scrolling can be used
            params.page = params.page || 1;



            return {
              results: $.map(data.value, function(item) {
                    return { id: item.CardCode, text: "<b>"+item.CardCode+"</b> "+item.CardName }; //adecuamos el arreglo al select
                }),
              pagination: {
                    more: (params.page * 30) < data.total_count
              }
            };
          },
          cache: true
        },
        escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
        /*formatNoMatches: function (term) {
            return 'No se encontraron clientes con el código: "' + term + '".<br/><!--span class="link">Click&nbsp;here</span-->',
        },*/
        minimumInputLength: 1,
        //templateResult: formatRepo, // omitted for brevity, see the source of this page
        //templateSelection: formatRepoSelection // omitted for brevity, see the source of this page
      });

正如您所看到的,我将查询作为参数加入小部件中输入的术语。问题是select2正在对查询进行编码,以便用加号(+)替换空格而不是&#34;%20&#34;所以api休息服务说这是一个非法的角色,我无法得到我的结果。

这就是它的样子:

https://service.net:50000/b1s/v1/BusinessPartners?%24filter=(startswith(CardCode%2C%27CLIEN%27)+or+startswith(CardName%2C%27CLIEN%27))&%24orderby=cardName

正如大家所见,&#34;或&#34;周围的空间运算符正被加号替换。我测试了javascript函数&#34; encodeUri()&#34;和&#34; encodeURIComponent()&#34;它什么也没做,因为我认为它是在代码中被序列化的。我添加了contentType,我用&#34;%20&#34;手动替换了空格。但结果是编码而且更糟糕(%2520)......

任何人都可以帮助我。有没有办法改变这种类型的编码,所以空格变为&#34;%20&#34;而不是该死的&#34; +&#34; ??

谢谢大家!

1 个答案:

答案 0 :(得分:0)

我自己回答。

我正在阅读有关文档的内容并找到了重要的线索:我可以获得ajax&#34; url&#34;来自javascript函数的属性获取被搜索的术语作为参数。所以我构建了连接查询字符串的url并使用了encodeURI javascript函数,它工作正常! :-D

ajax: {
            ....

            url: function (params) {
                return SLServer+"BusinessPartners"+encodeURI("?$top=15&$filter=((startswith(CardName,'" + params.term.toUpperCase() + "') or startswith(CardCode,'" + params.term.toUpperCase() + "') or startswith(CardName,'" + params.term + "') or startswith(CardCode,'" + params.term + "')) and CardType eq 'C')&$expand=PaymentTermsType";);
            },

            ....

所以空白空间在这个函数中被翻译为%20,而api很高兴并吐出结果......

希望这有助于其他人。来自委内瑞拉的拥抱; - )