如何在 vue js 中使用 html 的选择选项仅显示该类别的服务?

Posted

技术标签:

【中文标题】如何在 vue js 中使用 html 的选择选项仅显示该类别的服务?【英文标题】:How can I show only the services of that category using select option of html in vue js? 【发布时间】:2018-04-16 23:25:34 【问题描述】:

我有几个类别,如酒店、医疗保健等。所以,当我选择酒店时,应该只加载类别酒店的服务。现在,当我选择特定类别时,所有服务都在加载吗?

这是我的 vue js 脚本。它有两个网址,一个用于获取所有类别,另一个用于获取所有服务。

<script>
searchContent = new Vue(
        el: "#searchContent",
        data: 
          vector: 
        
      );
categories = new Vue(
    el: '#categories',
    data: 
        articles: [],
        services: [],
        category: 0,
        subcategory: 0,
        content: false
    ,
      watch: 
           subcategory: function(e) 
            this.prefetch();
          ,
           category: function() 
            var self = this;
            self.subcategory = 0;
            $.ajax(
              url: "https://n2s.herokuapp.com/api/post/get_all_services/",
              data: 
                'service': self.id
              ,
              type: "POST",
              dataType: "JSON",
              success: function(e) 
                self.services = e;
                self.prefetch();
              
            );
          ,
      ,

    mounted() 
        var vm = this;

        $.ajax(
            url: "https://n2s.herokuapp.com/api/post/get_all_category/",
            method: "GET",
            dataType: "JSON",
            success: function(e) 
                 vm.articles = e;
                console.log(e.articles)

            ,
        );
    ,

          methods: 
          prefetch: function() 
            var filter = ;
            filter['category'] = this.category;
            filter['subcategory'] = this.subcategory;
            if (this.content !== false)
              this.content.abort()
            this.content = $.ajax(
              'url': 'https://n2s.herokuapp.com/api/post/filter/',
              data: filter,
              dataType: "JSON",
              type: "POST",
              success: function(e) 
                 window.searchContent.vector = e.data;
                console.log(e);
              
            )
          
        

)
</script>

这是我的html代码

<div class="m-select">
<select class="" v-model="category" name=category>

<option value="">Select Service</option>
<option style="padding-left: 10px;" v-for="post in articles"v-bind:value="post.name" >post.name</option>

</select>
 </div>

<div class="m-select">
<select class="" v-model="subcategory" name="subcategory">
<option value="">Select Services</option>
<option v-for=" so in services" v-bind:value="so.name">so.name</option>
</select>
</div>

类别的 JSON 数据:url https://n2s.herokuapp.com/api/post/get_all_category/

["name": "Health care", "cat_id": 1, "name": "Education", "cat_id": 2, "name": "Bakery", "cat_id": 3, "name": "Software company", "cat_id": 4, "name": "Automobile", "cat_id": 5, "name": "Agriculture", "cat_id": 6, "name": "Marketing", "cat_id": 7, "name": "Multimedia", "cat_id": 8, "name": "Electrical Shop", "cat_id": 9, "name": "AutoTaxi", "cat_id": 10, "name": "Workshop", "cat_id": 11, "name": "Engineering Work", "cat_id": 12, "name": "Medical Shop", "cat_id": 13, "name": "Lathe", "cat_id": 14, "name": "Hotel", "cat_id": 15]

服务的 JSON 数据是:url https://n2s.herokuapp.com/api/post/get_all_services/

["name": "Eye clinic", "cat_id": 1, "sub_cat_id": 1, "name": "Homeo pathy", "cat_id": 1, "sub_cat_id": 2, "name": "Arts college", "cat_id": 2, "sub_cat_id": 3, "name": "Engineering", "cat_id": 2, "sub_cat_id": 4, "name": "Web development", "cat_id": 4, "sub_cat_id": 5, "name": "Wood lathe", "cat_id": 14, "sub_cat_id": 6, "name": "Steel lathe", "cat_id": 14, "sub_cat_id": 7, "name": "Steel lathe", "cat_id": 14, "sub_cat_id": 8, "name": "Hotel", "cat_id": 15, "sub_cat_id": 9, "name": "non veg hotels", "cat_id": 15, "sub_cat_id": 10, "name": "Veg Hotel", "cat_id": 15, "sub_cat_id": 11, "name": "Medicalshop", "cat_id": 13, "sub_cat_id": 12, "name": "Engineering Works", "cat_id": 12, "sub_cat_id": 13, "name": "Two Wheeler Workshop", "cat_id": 11, "sub_cat_id": 14, "name": "Four wheel workshop", "cat_id": 11, "sub_cat_id": 15, "name": "Auto Taxi", "cat_id": 10, "sub_cat_id": 16, "name": "Car", "cat_id": -1, "sub_cat_id": 17, "name": "Car", "cat_id": 10, "sub_cat_id": 18, "name": "Rent a Car", "cat_id": 10, "sub_cat_id": 19, "name": "electrical shop", "cat_id": 9, "sub_cat_id": 20]

所以,当我选择教育类别时,只加载与教育相关的服务。。如何使用 vues js 实现相同的功能?

【问题讨论】:

【参考方案1】:

方法 1 : 您可以在后端有一个 API,它根据类别 id 返回服务。即您应该能够传入类别 id,并且它应该返回基于此类别 id 的服务。然后调用这个 API 而不是你现在正在做的get_all_services

方法 2 : 根据 cat_idcategory 的监视处理程序内的前端所有服务的结果中过滤项目(请参阅下面添加的代码和注释) - JSFiddle link

watch: 
           subcategory: function(e) 
            this.prefetch();
          ,
           category: function() 
            var self = this;
            self.subcategory = 0;
            $.ajax(
              url: "https://n2s.herokuapp.com/api/post/get_all_services/",
              data: 
                'service': self.id
              ,
              type: "POST",
              dataType: "JSON",
              success: function(e) 
                let categoryIdArray = self.articles.filter(x=>x.name==self.category);
                self.services = e.filter(x=>x.cat_id==categoryIdArray[0].cat_id); // Filter items based on category id
                self.prefetch();
              
            );
          ,
      ,

【讨论】:

先生,感谢您的帮助.. 我试过这个.. 但我无法加载任何服务 您能否将console.log(e); 的输出添加到编辑行上方的成功处理程序中,并将console.log(self.services) 的输出添加到其下方并将其添加到原始问题中? 另外,请检查我的最新编辑 - self.category 而不是编辑行中的 category,然后再试一次 @coder 您是否在后端实现了 REST 服务?你能要求这样的东西:“n2s.herokuapp.com/api/post/services/cat_id/1”吗?还是只有这两个链接适用于所有类别和所有服务? @Vandesh 等一下.. 我正在检查【参考方案2】:

您以错误的方式使用 API。用这种方式重写你的应用:

    使用此 api 调用加载所有类别: https://n2s.herokuapp.com/api/post/get_all_category/

您将获得所有类别,结构如下:

[
  "name": "Health care", "cat_id": 1,
  "name": "Education", "cat_id": 2,
  // etc
]

    以这种方式创建带有选项的选择:

    您将仅获得所选 id 的服务:

    [
      "name": "Eye clinic", "cat_id": 1, "sub_cat_id": 1,
      "name": "Homeo pathy", "cat_id": 1, "sub_cat_id": 2
    ]
    
      现在,作为最后一步,使用基于此 json 的选项填充您的第二个选择...

    我喜欢编码,所以只是为了好玩,你的 API 有一个工作示例 :)

    var store = new Vuex.Store(
      state: 
        categories: [],
        services: []
      ,
      actions: 
        async loadOptions (state, data) 
          var response = await fetch(data.src + data.id)
          state[data.to] = await response.json()
        
      
    )
    
    Vue.component('my-selector', 
      template: '#my-selector',
      methods: 
        loadServices (ev) 
          this.$store.dispatch('loadOptions', 
            to: 'services',
            src: 'https://n2s.herokuapp.com/api/post/get_services_of/',
            id: ev.target.value
          )
        
      ,
      created () 
        this.$store.dispatch('loadOptions', 
          to: 'categories',
          src: 'https://n2s.herokuapp.com/api/post/get_all_category/',
          id: ''
        )
      
    )
    
    new Vue(
      el: '#app',
      store
    )
    <div id="app">
      <my-selector></my-selector>
    </div>
    
    <template id="my-selector">
      <div>
        <select @change="loadServices">
          <option value="0" selected>Select category</option>
          <option
            v-for="category in $store.state.categories"
            :key="category.cat_id"
            :value="category.cat_id"
          >
             category.name 
          </option>
        </select>
        <br>
        <select>
          <option value="0" selected>Select service</option>
          <option
            v-for="service in $store.state.services"
            :key="service.sub_cat_id"
            :value="service.sub_cat_id"
          >
             service.name 
          </option>
        </select>
      </div>
    </template>
    
    <script src="https://unpkg.com/vuex@3.0.1/dist/vuex.min.js"></script>
    <script src="https://unpkg.com/vue@2.5.3/dist/vue.min.js"></script>

【讨论】:

@coder 在我的回答中查看添加的示例。我认为它可以激发您简化实际代码。 先生,我可以问你一个问题吗。。当我搜索时(如我上面的代码),我得到的结果是 json 数据(即所有的搜索结果......会有很多搜索结果)。那么,当我点击一个特定的搜索项目时.. 我怎样才能转到另一个页面并打印它的详细信息?你能帮我解决一下吗 我不确定...通常,实现分页取决于您,这需要基于 api 可能性的单独方法。没有通用的、简单的解决方案。 你好先生..你在吗 你能看看这个问题吗..我真的被这个问题困住了。

以上是关于如何在 vue js 中使用 html 的选择选项仅显示该类别的服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在html vue js中基于多个选择选项添加行?

(Vue.js)如何使用数据中数值数组中的选项标记填充选择标记?

如何使用 vue js html 中的数组检查 v-if 条件?

如何使用 Vue.js 在选择选项上使用转换

如何在 Vue JS 中连接按钮并使用其选项进行选择

如何在选项/选择标签循环之外的按钮中使用 Vue.js 中下拉列表的选定 ID