2017-08-16 65 views
0

我想在类别之间建立一个菜单。如果一个类别有一个子类别,它会返回一个值,该值表示has_subCategory为boolean 0/1。Vue 2组件道具变得错误值

<template> 
    <select><slot></slot></select> 
</template> 

<script> 

    export default { 

     props: ['value', 
       'hasSubCat'], 
     watch: { 
     value: function(value, hasSubCat) { 
      this.relaod(value); 
      this.fetchSubCategories(value, hasSubCat); 
     } 
     }, 
     methods: { 
     relaod: function(value) { 

      var select = $(this.$el); 

      select.val(value || this.value); 
      select.material_select('destroy'); 
      select.material_select(); 

     }, 
     fetchSubCategories: function(value, hasSubCat) { 
      var mdl = this; 
      var catID = value || this.value; 
      var has_subCat = hasSubCat || this.hasSubCat; 

      console.log("has_subCat:" + has_subCat); 

      mdl.$emit("reset-subcats"); 

      if (catID) { 
      if (has_subCat == 0) { 
       if ($('.subdropdown').is(":visible") == true) { 
       $('.subdropdown').fadeOut(); 
       } 
      } else { 
       axios.get(URL.API + '/subcategories/' + catID) 
       .then(function(response) { 
        response = response.data.subcatData; 
        response.unshift({ 
        subcat_id: '0', 
        subcategory_name: 'All Subcategories' 
        }); 
        mdl.$emit("update-subcats", response); 

        $('.subdropdown').fadeIn(); 
       }) 
       .catch(function(error) { 
        if (error.response.data) { 

        swal({ 
         title: "Something went wrong", 
         text: "Please try again", 
         type: "error", 
         html: false 
        }); 

        } 
       }); 
      } 
      } else { 
      if ($('.subdropdown').is(":visible") == true) { 
       $('.subdropdown').fadeOut(); 
      } 
      } 
     } 
     }, 
     mounted: function() { 

     var vm = this; 
     var select = $(this.$el); 

     select 
      .val(this.value) 
      .on('change', function() { 
      vm.$emit('input', this.value); 
      }); 

     select.material_select(); 
     }, 
     updated: function() { 

     this.relaod(); 
     }, 
     destroyed: function() { 

     $(this.$el).material_select('destroy'); 
     } 
    } 
</script> 


<material-selectcat v-model="catId" name="category" @reset-subcats="resetSubCats" @update-subcats="updateSubCats" id="selcat"> 
        <option v-for="cat in cats" :value="cat.cat_id" :hasSubCat="cat.has_subCat" v-text="cat.category_name"></option> 
        </material-selectcat> 

的数据是这样的:

cat_id:"0" 
category_name:"All Subcategories" 
has_subCat:0 

什么我不明白的是,的console.log( “has_subCat:” + hasSubCat);每次更改选择时,都会打印出不同的值。它应该只显示或

+0

你能分享一个MCVE吗? – Terry

+0

@Terry更新了我的问题 – user2722667

回答

1

看守应该以用来观看一个值,但你可以通过help of computed满足您的要求。

export default { 
    props: ['value', 
      'hasSubCat'], 
    watch: { 
    /* without this, watcher won't be evaluated */ 
    watcher: function() {} 
    }, 
    computed: { 
    watcher: function() { 
     this.reload(this.value); 
     this.fetchSubCategories(this.value, this.hasSubCat); 
    } 
    }, 
    ... 
} 

我也做了简化的工作fiddle,你可以看看。

+0

Ahhhh这条线做了''watcher:function(){}''! – user2722667

+0

唯一的问题是,即使我没有选择一个值,现在select会在页面加载后尝试调用我的api。还有''console.log(“has_subCat:”+ has_subCat);''总是返回undefined。但我可以选择我的数据,它确实存在它只是没有传递给''fetchSubCategories();''功能 – user2722667

+0

您可以简单地使用一个标志变量并在发生选择时将其变为true。 – choasia

0

你假设你的手表功能的第二个参数是hasSubCat这是情况并非如此。尽管value监视函数的第一个参数表示属性的新值,但第二个参数实际上是被监视属性的旧值。尝试了解更多。

watch: { 
    value: function(value, oldValue) { 
    console.log('new value:', value) 
    console.log('old value:', oldValue) 
    } 
} 

所以看双方的valuehasSubCat,你可以做这样的事情:在vue.js

watch: { 
    value: function(newValue) { 
    this.reload(newValue) 
    this.fetchSubCategories(newValue, this.hasSubCat) 
    }, 
    hasSubCat: function(newHasSubCat) { 
    this.reload(this.value) 
    this.fetchSubCategories(this.value, newHasSubCat) 
    } 
} 
+0

有什么方法可以观察这两个值吗? – user2722667

+0

是的,看看我编辑的答案。 – Ikbel

+0

对不起,我不清楚。我尝试过这一点,但由于在两个观察器中都调用了fetchSubCategories(),所以这会调用相同的API调用两次。我想知道是否可以使用相同的功能“观看”这两个道具 – user2722667