【问题标题】:Materialize autocomplete with dynamic data in jquery ajax在jquery ajax中使用动态数据实现自动完成
【发布时间】:2017-02-14 10:57:55
【问题描述】:

我在 ASP.Net MVC 应用程序中使用物化 ui,并且我正在使用带有动态数据的自动完成控件。

这是我的代码,

<div class="row">
    <div class="col s12">
        <div class="row">
            <div class="input-field col s12">
                <i class="material-icons prefix">textsms</i>
                <input type="text" id="autocomplete-input" class="autocomplete">
                <label for="autocomplete-input">Autocomplete</label>
            </div>
        </div>
    </div>
</div>

这是 jquery ajax 调用,

$(function () {
    $.ajax({
        type: 'GET', // your request type
        url: "/Home/GetData/",
        success: function (response) {
            var myArray = $.parseJSON(response);

            debugger;
            $('input.autocomplete').autocomplete({
                data: {
                    "Arizona (1)": null,
                    "Florida (2)": null,
                    "Georgia (3)": null,
                    "Hawaii(4)": null, 
                    "Idaho (5)": null,
                    "Illinois (6)": null
                }
            });
        }
    });
});

它只能接受这种格式的数据,这是我的回应,

"[["Arizona (1)"],["Florida (2)"],["Georgia (3)"],["Hawaii (4)"],["Idaho (5)"],["Illinois (6)"]]"

如何将我的回复转换为自动完成功能可以理解的格式?

【问题讨论】:

  • 您的回复是:"[[\"Arizona (1)\"],[\"Florida (2)\"],[\"Georgia (3)\"],[\ "夏威夷 (4)\"],[\"爱达荷 (5)\"],[\"伊利诺伊 (6)\"]]" ?
  • 我使用 -> var str = JSON.stringify(response); 得到响应

标签: javascript jquery ajax autocomplete materialize


【解决方案1】:

不是很花哨,但试试看:

$(function () {
    $.ajax({
        type: 'GET', // your request type
        url: "/Home/GetData/",
        success: function (response) {
            var myArray = $.parseJSON(response);
            var dataAC = {};
            for(var i=0;i<myArray[0].length;i++){
                eval("dataAC." + myArray[0][i] + " = null;");
            }
            debugger;
            $('input.autocomplete').autocomplete({
                data: dataAC
            });
        }
    });
});

【讨论】:

  • 我做了这样的改变: eval("\"" + myArray[0][i] + "\"" + " : null,");但现在它给了我无效:令牌错误:null
【解决方案2】:

您可以使用 Devberidge 插件轻松实现自动完成功能。

使用https://github.com/devbridge/jQuery-Autocomplete获取 Devbridge 插件

     <script type="text/javascript">

    $(document).ready(function() {


              $("#country").devbridgeAutocomplete({
                //lookup: countries,
                serviceUrl:"getCountry.php", //tell the script where to send requests
                  type:'POST',


                  //callback just to show it's working
                  onSelect: function (suggestion) {
                     // $('#selection').html('You selected: ' + suggestion.value + ', ' + suggestion.data);
                    },
                showNoSuggestionNotice: true,
                noSuggestionNotice: 'Sorry, no matching results',


              });

    });

  </script>

这里的 getCountry.php 文件返回 JSON 数据。 欲了解更多信息,请访问https://ampersandacademy.com/tutorials/materialize-css/materialize-css-framework-ajax-autocomplete-example-using-php

【讨论】:

    【解决方案3】:

    使用 ajax API 调用 materializecss 输入自动完成
    我进行了如下修改以获得国家/地区的自动完成输入。

    您可以从 API https://restcountries.eu/rest/v2/all?fields=name 获取国家名称列表

    $(document).ready(function() {
      //Autocomplete
      $(function() {
        $.ajax({
          type: 'GET',
          url: 'https://restcountries.eu/rest/v2/all?fields=name',
          success: function(response) {
            var countryArray = response;
            var dataCountry = {};
            for (var i = 0; i < countryArray.length; i++) {
              //console.log(countryArray[i].name);
              dataCountry[countryArray[i].name] = countryArray[i].flag; //countryArray[i].flag or null
            }
            $('input.autocomplete').autocomplete({
              data: dataCountry,
              limit: 5, // The max amount of results that can be shown at once. Default: Infinity.
            });
          }
        });
      });
    });
    <link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.2/css/materialize.min.css" rel="stylesheet" />
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.2/js/materialize.min.js"></script>
    <div class="row">
      <div class="col s12">
        <div class="row">
          <div class="input-field col s12">
            <label for="country">Autocomplete</label>
            <input type="text" id="country" class="autocomplete">
    
          </div>
        </div>
      </div>
    </div>

    【讨论】:

      【解决方案4】:

      美好的一天。我可以建议一些不同的方法。实现自动完成有方法

      更新数据

      所以如果我们想让ajax加载数据,我们可以在输入字段中添加事件监听器

         $(".autocomplete").each(function () {
          let self = this;
          $(this).autocomplete();
          $(this).on("input change", function () {
              $.ajax({
                  url: '/source/to/server/data',
                  type: 'post',
                  cache: false,
                  data: {"some": "data"},
                  success: function (data) {
                      data = JSON.parse(data);
                      $(self).autocomplete("updateData", data/*should be object*/);
                  },
                  error: function (err) {
                      console.log(err);
                  }
              });
          });
      });
      

      不适合不同的数据源,但可能是一个起点。

      【讨论】:

      • 这个答案最终会在成功功能上再次调用 url 作为
      • 这个答案应该被接受,因为它永远不会破坏非常大的数据。不利的一面是,每次用户尝试输入任何字符甚至删除它们时,它都会触发 API。您可以通过实施时间检查以限制频繁点击来限制这一点。就像另一个搜索引擎一样
      【解决方案5】:

      尝试通过这种方式转换您的响应,在您的情况下您不需要第一行代码。

      var responseData = JSON.parse(`[["Arizona (1)"],["Florida (2)"],["Georgia (3)"],["Hawaii (4)"],["Idaho (5)"],["Illinois (6)"]]`);
      
      var acArray = [];
      var acData = {};
      responseData.forEach(res => {
        acArray.push(res.join())
      })
      acArray.forEach(acObj => {
        acData[acObj] = null;
      })
      console.log(acData)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-23
        • 2013-01-12
        • 2013-01-07
        • 1970-01-01
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多