代码之家  ›  专栏  ›  技术社区  ›  sigur7

Vue JS搜索筛选器-数据和绑定加载问题

  •  1
  • sigur7  · 技术社区  · 8 年前

    我有一个表单,它当前从一个外部JSON中提取一组数据作为选项列表,我正在尝试合并一个搜索过滤器来显示您键入的选项。这是我创建的计算代码:

    计算:{
    searchedslots:函数()。{
    返回此.items.filter(函数(项){
    返回(
    (item.shortcode.tolowercase().match(this.searchterms.tolowercase()))||
    (item.slots.tolowercase().match(this.searchterms.tolowercase())匹配)
    )
    }.bind(这个));
    }
    }
    

    此外,搜索v模型输入不会显示在摘要中

    以下是表单,位于jsfiddle

    下面是填写表单后的外观示例

    <!文档类型HTML>
    <html lang=“en”>
    
    <头部>
    <meta charset=“utf-8”/>
    <meta http equiv=“x-ua-compatible”content=“ie=edge,chrome=1”/>
    <meta content='width=device width,initial scale=1.0,maximum scale=1.0,user scalable=0,shrink to fit=no'name='viewport'
    />
    
    <样式>
    输入、选择、按钮{
    浮动:左;
    显示:块;
    清楚:两者都清楚;
    最小宽度:200px;
    页底:1页;
    }
    
    .maxfee、.summary、p.summaryresult{
    浮动:左;
    显示:块;
    清除:两个
    }
    </style>
    
    <!--vue.js cdn——>
    <script src=“https://unpkg.com/vue”></script>
    
    </head>
    
    <正文>
    
    
    <form name=“MyForm”id=“DeliveryService”>
    
    <!--<pre>items.shortcode</pre>-->
    
    <!--从外部JSON文件加载到dayslots中-->
    <input name=“day slot”v-for=“item in searchedslots”v-model.lazy=“dayslotv”type=“text”placeholder=“enter day and delivery slot”必需>
    
    <选择v-model=“search”>
    <option v-for=“item in items”v-bind:value=“item.slot”>
    item.shortcode item.slot
    </选项>
    </选择>
    
    <选择v-model=“servicev”Required>
    <选项已选择已禁用隐藏>请选择</选项>
    <option value=“standard”>标准</option>
    <option value=“安装”>安装</option>
    </选择>
    
    <!--客户添加他们希望支付的最大金额-->
    <div class=“maxfee”>
    <input name=“price”v-model.number=“pricev”type=“currency”placeholder=“将支付的最高价格”必需>
    </DIV>
    
    <!--然后,在提交之前,我们将显示他们选择的选项的摘要-->
    <DIV class=“summary”><P>摘要:</P></DIV>
    <p class=“SummaryResult”style=“font-weight:bold;”>我希望search.shortcode开启服务并支付不超过</p>
    
    <button type=“submit”>提交</button>
    </Form>
    
    <脚本>
    const app=新Vue({
    el:“交付服务”,
    数据:{
    项目:[],
    搜索:“”,
    日槽:“”,
    服务v:“”,
    价格:“”
    
    },请
    已创建:函数()。{
    fetch('https://s3.eu-west-2.amazonaws.com/dayslots10/dayslots.json')
    。然后(resp=>resp.json())
    。然后(items=>){
    this.items=项目
    })
    },请
    })(二)
    </script>
    
    </body>
    
    </html>
    
    
    
    computed: {
                searchedSlots: function() {
                  return this.items.filter(function(item) {
                    return (
                      (item.shortcode.toLowerCase().match(this.searchTerms.toLowerCase())) ||
                      (item.slots.toLowerCase().match(this.searchTerms.toLowerCase()))
                    )
                  }.bind(this));
                }
              }
    

    此外,搜索v模型输入不显示在总结

    这是下表JSFiddle

    下面是填写表单后的外观示例 enter image description here

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
        <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no' name='viewport'
        />
    
        <style>
        input, select, button {
            float:left;
            display:block;
            clear:both;
            min-width:200px;
            margin-bottom: 1rem;
          }
    
          .maxfee, .summary, p.summaryresult {
            float:left;
            display:block;
            clear:both
          }
        </style>
    
        <!-- Vue.js CDN -->
        <script src="https://unpkg.com/vue"></script>
    
    </head>
    
    <body>
    
    
      <form name="myform" id="deliveryservice">
    
            <!--<pre>{{ items.shortcode }}</pre>-->
    
            <!-- Load in dayslots from external JSON file -->
            <input name="dayslot" v-for="item in searchedSlots" v-model.lazy="dayslotv" type="text" placeholder="Enter Day and Delivery Slot" required>
    
            <select v-model="search">
                <option v-for="item in items" v-bind:value="item.slot">
                  {{ item.shortcode }} {{ item.slot }}
                </option>
              </select>
    
            <select v-model="servicev" required>
              <option selected disabled hidden>Please Select</option>
              <option value="standard">Standard</option>
              <option value="installation">Installation</option>
            </select>
    
            <!-- Customer adds the max amount they wish to pay -->
            <div class="maxfee">
                <input name="price" v-model.number="pricev" type="currency" placeholder="Max price you will pay" required>
            </div>
    
            <!-- We then display a summary of the options they chose, before they submit -->
            <div class="summary"><p>Summary:</p></div>
            <p class="summaryresult" style="font-weight:bold;">I would like {{ search.shortcode }} on {{ servicev }} service and pay no more than £{{ pricev }}</p>
    
            <button type="submit">Submit</button>
        </form>
    
        <script>
            const app = new Vue({
              el: '#deliveryservice',
              data: {   
                items: [],
                search: '',
                dayslotv: '',
                servicev: '',
                pricev: ''
    
              },
              created: function() {
                fetch('https://s3.eu-west-2.amazonaws.com/dayslots10/dayslots.json')
                  .then(resp => resp.json())
                  .then(items => {        
                    this.items = items
                  })
              },
            });
            </script>
    
    </body>
    
    </html>
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Vladislav Ladicky    8 年前

    我修正了一些错误。过滤将在几分钟内完成。

    new Vue({
      el: '#deliveryservice',
    
      data: {
        items: [],
        query: '',
        slot: '',
        service: 'standard',
        price: '0',
        src: 'https://s3.eu-west-2.amazonaws.com/dayslots10/dayslots.json'
      },
      
      methods: {
        setSlot (evt) {
          this.slot = evt.target.value
        }
      },
      
      async created () {
        this.items = await (await fetch(this.src)).json()
        this.slot = this.items[0].slot
      }
    })
    input, select, button {
      float: left;
      display: block;
      clear: both;
      min-width: 200px;
      margin-bottom: 1rem;
    }
    
    .maxfee, .summary, p.summaryresult {
      float: left;
      display: block;
      clear: both
    }
    <form name="myform" id="deliveryservice">
      <input
        v-model="query"
        type="text"
        placeholder="Enter Day and Delivery Slot"
        required
      >
    
      <select value="slot" @change="setSlot">
        <option
          v-for="({shortcode, slot}, idx) in items"
          :value="slot"
          :selected="idx === 0"
        >{{ shortcode }} - {{ slot }}</option>
      </select>
    
      <select v-model="service" required>
        <option value="standard">Standard</option>
        <option value="installation">Installation</option>
      </select>
    
      <div class="maxfee">
        <input
          v-model.number="price"
          type="number"
          min="0"
          placeholder="Max price you will pay"
          required
        >
      </div>
    
      <div class="summary">
        <p>Summary:</p>
      </div>
      
      <p class="summaryresult" style="font-weight:bold;">
        I would like
        {{ slot }}
        on
        {{ service }}
        service and pay no more than
        £{{ price }}
      </p>
            
      <button type="submit">Submit</button>
     </form>
    
    <script src="https://unpkg.com/vue"></script>