在v-for元素(Vue.js)中调用函数(带参数)

时间:2017-10-09 15:12:46

标签: javascript vue.js

我尝试使用2个级别(类别和项目)生成一个选择(使用Vue.js和Material Design)。一个类别可以有X个项目(选择与否)。

<md-select v-if="categories.length > 0" name="categories" id="categories" multiple > 
    <div v-for="(category,key,index) in categories" :key="category.id">
       <md-subheader>{{category.name}}</md-subheader>
       <md-option 
          v-if="category.subItems" 
          v-for="subItem in category.subItems" 
          :key="subItem.id" 
          :value="subItem.id"
          selected="checkIsSelected(subItem.id)">
           {{subItem.name}}
       </md-option>      
     </div>
</md-select>

这会产生一个选择:

   Category 1
      [ ] - Item 1
      [x] - Item 2
      [ ] - Item 3
   Category 2
      ...

问题我遇到的是当我尝试检查项目是否已经被选中时(来自API)我使用的方法:

  

选定=&#34; checkIsSelected(subItem.id)&#34;

在我的methods: {

methods: {

...

  checkIsSelected (catId) {
    this.selectedOld.map((catOld) => {
      if (catId === catOld.id) {
        return true
      }
    })
    return false
  }
}

简要说明:

  

如何在一个元素中调用一个函数(带参数)   v-for以检查/取消选中元素?

但是这个函数永远不会被调用。我做错了什么?我尝试了其他一些想法,但也没有工作。

感谢您的帮助,谢谢!

3 个答案:

答案 0 :(得分:1)

您可以尝试添加v-model="currentCategorySelected"并使用函数@change="checkIsSelected"。这样,只要选择了新选项,就会执行并传递通过回调选择的id。

这应该有效:

<md-select
  v-if="categories.length > 0"
  name="categories"
  id="categories"
  v-model="currentCategorySelected"
  @change="checkIsSelected"
  multiple>
    <div 
      v-for="(category,key,index) in categories"
      :key="category.id">

      <md-subheader>
        {{category.name}}
      </md-subheader>

      <md-option
        v-if="category.subItems"
        v-for="subItem in category.subItems"
        :key="subItem.id"
        :value="subItem.id"
      >
        {{subItem.name}}
      </md-option>
    </div>
</md-select>

答案 1 :(得分:0)

您需要将selected="checkIsSelected(subItem.id)"更改为:selected="checkIsSelected(subItem.id)"。结肠。

答案 2 :(得分:0)

最后,我用不同的方法解决了自己。希望也许可以帮到某人

我没有调用for option中的函数,而是先调用API来检查它是否先前被选中,并向subItem元素添加属性。

在第一次加载时使用@Ricardo Orellana解决方案,只有当select值发生变化时,我才能知道选择了哪个项目。

我使用v-bind:class选项检查是否选择了subItem并标记:

   <md-select v-if="categories.length > 0" name="categories" id="categories" multiple v-model="selectedNew"> 
      <md-button class="md-icon-button" md-menu-trigger slot="icon">
        <md-icon>{{icon}}</md-icon>      
      </md-button>

      <div v-for="(category,key,index) in categories" :key="category.id">
        <md-subheader>{{category.name}}</md-subheader>
        <md-option 
          v-bind:class="{ 'md-checked' : subItem.selected }"
          v-if="category.subItems" 
          v-for="subItem in category.subItems"
          :key="subItem.id" 
          :value="subItem">
            {{subItem.name}}
        </md-option>      
      </div>
    </md-select>

然后,在method部分:

   ...
   cat.subItems = actobj                
   cat.subItems.map(this.markIsSelected)
   ...

   markIsSelected (cat, index, categories) {
      categories[index].selected = false
      this.selectedOld.forEach(function (catOld) {
        if (cat.id === catOld.optionId) {
          categories[index].selected = true
          return
        }
      })
    }

感谢您的时间和帮助!