2017-01-23 1 views
1

То, что я пытаюсь достичь здесь, заключается в том, что когда я нажимаю на элемент в Item-card-product-choices.vue, он вызывает selectPC с аргументом productChoice.id, и это также приведет к тому, что родитель сможет прослушать это событие и получить аргумент в то же время. Я следую the doc, но родитель, похоже, не прослушивает selectPC. Поэтому, пожалуйста, решите следующие вопросы senpai:Vue2 Laravel5.3 Как отправить данные от дочернего к родительскому событию

  1. Что случилось с моим родителем, чтобы выслушать событие ребенка?
  2. Когда родитель прислушивается, как получить аргумент, который использует ребенок в событии? Спасибо.

Item-карты продукта choices.vue

<template> 
    <ul class="product-choices"> 
    <li 
    v-for="productChoice in productChoices" 
    class="product-choice" 
    @click.prevent="selectPC(productChoice.id)" 
    > 
     <svg v-if="productChoice.color === 'red'" width="20" height="20"> 
     <rect width="20" height="20" style="fill:#FF3333"></rect> 
     </svg> 
     ...... 
     ...... 
     ...... 
    </li> 
    </ul> 
</template> 

<script> 
    export default { 
    props:[ 
     'index', 
     'product' 
    ], 
    data() { 
     return { 
     productChoices:{}, 
     } 
    }, 
    methods:{ 
     selectPC(productChoice){ 
     var vm = this; 
     vm.$emit('select',productChoice) 
     }, 
    } 
    } 
</script> 

Parent.vue

<template> 
    <div> 
    .... 
    <product-choices :product="product" @selectPC="getSelected(productChoice)"></product-choices> 
    .... 
    </div> 
</template> 

<script> 
    import productChoices from './Item-card-product-choices.vue'; 
    export default { 
    components:{ 
     'product-choices':productChoices 
    }, 
    data(){ 
     return{ 
     productChoiceSelected:{}, 
     } 
    }, 
    methods:{ 
     getSelected(selected){ 
     var vm = this 
      alert(1) // this is what I added to test if it listens 
     vm.$on('select',function(selected){ 
      vm.$http.get('/getProductChoice/'+vm.product.id+'/'+selected).then((response)=>{ 
      vm.productChoiceSelected = response.data 
      }); 
     }) 
     } 
    } 
</script> 

ответ

1

вы излучающие называется событие "выбрать", а не "selectPC" так что вы нужно слушать, что в Parent.vue

<product-choices :product="product" @select="getSelected"></product-choices> 

Ваш getSelected метод не должен добавить $on слушателя либо ...

getSelected(selected) { 
    this.$http.get('/getProductChoice/' + this.product.id + '/' + selected).then(response => { 
    this.productChoiceSelected = response.data 
    }) 
} 
+0

Так что, если я не использую '$ emit', согласно документу я поделился, родитель может на самом деле слушать метод ребенка права? и разве это не то, что я делал в своем коде? – warmjaijai

+0

@warmjaijai дочерний компонент все равно должен '$ emit' событие. И как говорится в документе, который вы разделили ... [* «Вы не можете использовать' $ on' для прослушивания событий, выпущенных дочерними элементами. Вы должны использовать 'v-on' непосредственно в шаблоне * * (https: // vuejs.org/v2/guide/components.html#Using-v-on-with-Custom-Events). Обратите внимание: '@select =" ... "' это то же самое, что 'v-on: select =" ... "' – Phil

+0

О, я видел, что в коде теперь испускает код, в докторе увеличивается инкремент метода и приращение emit смутил меня. Позвольте мне попробовать ваше предложение сейчас спасибо @Phil – warmjaijai