2017-04-19 80 views
1

我正在使用带有复选框的Vuejs编写过滤器应用程序。当我使用单个复选框时,它运行良好。但是,当我检查超过2个复选框时,它将删除结果。在计算过滤器中使用Vuejs时出现的问题

例如,当我检查绿色和红色,它应该显示的标题1和标题2 或者当我检查绿色,红色,活动,已完成,它应该显示的标题1和标题2

您可以查看我的代码:https://jsfiddle.net/dalenguyen/xLcvdy0n/1/

HTML代码:

<div class="content"> 
<div class="row"> 
    <div class="col-md-3 col-sm-4"> 
     <div class="box box-info"> 
      <div class="box-header with-border"> 
       <h3 class="box-title">Filter by</h3> 
      </div> 
      <!-- /.box-header --> 
      <!-- form start --> 
       <div class="box-body"> 
        <div class="box box-success box-solid"> 
         <div class="box-header with-border"> 
          <h3 class="box-title">Health</h3> 
          <!-- /.box-tools --> 
         </div> 
         <!-- /.box-header --> 
         <div class="box-body" style="display: block;"> 
          <div class="form-group col-md-12"> 
           <input type="checkbox" id="green" value="Green" v-model="checkedHealths" name="Healths"> 
           <label for="green">Green</label> 

          </div> 
          <div class="form-group col-md-12"> 
           <input type="checkbox" id="red" value="Red" v-model="checkedHealths" name="Healths"> 
           <label for="red">Red</label> 
          </div> 
          <div class="form-group col-md-12"> 
           <input type="checkbox" id="yellow" value="Yellow" v-model="checkedHealths" name="Healths"> 
           <label for="yellow">Yellow</label> 
          </div> 
         </div> 
         <!-- /.box-body -->      
        </div> 

        <div class="box box-success box-solid"> 
         <div class="box-header with-border"> 
          <h3 class="box-title">Status</h3> 
          <!-- /.box-tools --> 
         </div> 
         <!-- /.box-header --> 
         <div class="box-body" style="display: block;"> 
          <div class="form-group col-md-12"> 
           <input type="checkbox" id="active" value="Active" v-model="checkedStatuses" name="Statuses"> 
           <label for="active">Active</label> 
          </div> 
          <div class="form-group col-md-12"> 
           <input type="checkbox" id="completed" value="Completed" v-model="checkedStatuses" name="Statuses"> 
           <label for="completed">Completed</label> 
          </div> 
          <div class="form-group col-md-12"> 
           <input type="checkbox" id="cancelled" value="Cancelled" v-model="checkedStatuses" name="Statuses"> 
           <label for="cancelled">Cancelled</label> 
          </div> 
         </div> 
         <!-- /.box-body --> 
        </div> 
        <button type="button" class="btn btn-block btn-info" v-on:click="resetFilter">Reset</button> 

       </div> 
       <!-- /.box-body --> 
     </div> 
    </div> 
    <div class="col-md-9 col-sm-8"> 

     <div class="col-md-4" v-for="project in filteredProjects"> 
      <div class="box collapsed-box"> 
       <div class="box-header with-border"> 
        <h4 class="box-title"><a href="">{{project['title']}}</a></h4> 
        <!-- /.box-tools --> 
       </div> 
       <!-- /.box-header --> 
       <div class="box-body"> 
        <table class="table table-striped"> 
         <tr> 
          <td>Status</td> 
          <td>{{project['Status']}}</td> 
         </tr> 
         <tr> 
          <td>Health</td> 
          <td>{{project['Health']}}</td> 
         </tr> 
        </table> 
       </div> 
       <!-- /.box-body --> 
      </div> 
      <!-- /.box --> 
     </div> 
    </div> 
</div> 

</div> 

Vuejs代码:

var app = new Vue({ 
      el: '.content', 

      data: { 
       projects: [ 
        { 
         "title": "Title 1", 
         "Status": "Active", 
         "Health": "Green", 
        }, 
        { 
         "title": "Title 2", 
         "Status": "Completed", 
         "Health": "Red", 
        }, 
        { 
         "title": "Title 3", 
         "Status": "Cancelled", 
         "Health": "Yellow", 
        },      
        ]         
       , 
       checkedHealths: [], 
       checkedStatuses: [] 
      }, 

      computed: { 
       filteredProjects: function(){ 
        let filterProjects = this.projects; 


        $.each(this.checkedHealths, function(value, key){      
         filterProjects = filterProjects.filter(function(project){        
          return project.Health == key; 
         }) 
        }); 

        $.each(this.checkedStatuses, function(value, key){ 
         filterProjects = filterProjects.filter(function(project){ 
          return project.Status.includes(key); 
         }) 
        }); 

        return filterProjects; 
       } 
      }, 

      mounted: function(){ 

       jQuery('input').iCheck({ 
        checkboxClass: 'icheckbox_square-green', 
        radioClass: 'iradio_square-green', 
        increaseArea: '20%' // optional 
       }); 

       jQuery('input').on('ifChecked', function(e){ 

        if($(this).attr('name') === "Healths") 
         app.$data.checkedHealths.push($(this).val()); 

        if($(this).attr('name') === "Statuses") 
         app.$data.checkedStatuses.push($(this).val()); 

       }); 

       jQuery('input').on('ifUnchecked', function(e){ 

        if($(this).attr('name') === "Healths"){ 
         let data = app.$data.checkedHealths; 
         app.$data.checkedHealths.splice(data.indexOf($(this).val()),1); 
        } 

        if($(this).attr('name') === "Statuses"){ 
         let data = app.$data.checkedStatuses; 
         app.$data.checkedStatuses.splice(data.indexOf($(this).val()),1); 
        } 

       }); 
      }, 

      methods: { 
       resetFilter: function(){ 
        $('input').iCheck('uncheck'); 
       } 
      } 
     }) 

回答

3

您的filterProjects方法应该看起来像这样。

filteredProjects: function(){ 
    let filterProjects = this.projects; 

    if (this.checkedHealths.length > 0){ 
    filterProjects = filterProjects.filter(project => { 
     return this.checkedHealths.includes(project.Health); 
    }) 
    } 

    if (this.checkedStatuses.length > 0){ 
    filterProjects = filterProjects.filter(project => { 
     return this.checkedStatuses.includes(project.Status) 
    }) 
    } 

    return filterProjects; 
} 

更新fiddle

基本上,您的旧过滤器代码是单独检查每个过滤器,您需要一次处理它们。上面的代码遍历项目并检查项目的值是否在选定的过滤器值中。

你也使用了很多jQuery,你可以使用本地方法和Vue。

+0

谢谢@Bert Evans。你太棒了! –

+0

这是因为iCheck需要JQuery,所以我使用它。有什么最佳做法可以推荐?谢谢, –

+0

@DaleNguyen通常,使用jQuery插件,你想把它们包装在一个Vue组件中。在这种情况下,您可能想要创建一个iCheck复选框组件,并且任何jQuery代码只能在其中使用。这是一个封装插件的Vue文档的例子。 https://vuejs.org/v2/examples/select2.html – Bert

相关问题