我有这个组件:
<template>
<div class="modal fade modal-primary" id="imageModal" tabindex="-1" role="dialog" aria-labelledby="ImageLabel"
aria-hidden="true">
<div class="modal-dialog modal-lg animated zoomIn animated-3x">
<div class="modal-content">
<ais-index index-name="templates"
app-id="BZF8JU37VR"
api-key="33936dae4a732cde18cc6d77ba396b27">
<div class="modal-header">
<algolia-menu :attribute="category"
:class-names="{ 'nav-item__item': 'nav-color', 'nav-item__link': 'nav-link', 'nav-item__item--active': 'active'}">
</algolia-menu>
</div>
<div class="modal-body">
<div class="container">
<ais-results :results-per-page="10" inline-template>
<div class="row">
<div class="col-6" v-for="result in results.slice(0, 5)" :key="result.objectID">
<div class="card" @click="getTemplate(result)">
<img class="img-fluid" v-lazy="result.image"/>
<div class="card-body">
<p>{{ result.description }}</p>
</div>
<div class="card-footer">
<small>Created: {{ result.created_at }}</small>
</div>
</div>
</div>
<div class="col-6" v-for="result in results.slice(5, 10)" :key="result.objectID">
<div class="card">
<img class="img-fluid" v-lazy="result.image"/>
<div class="card-body">
<p>{{ result.description }}</p>
</div>
<div class="card-footer">
<small>Created: {{ result.created_at }}</small>
</div>
</div>
</div>
</div>
</ais-results>
</div>
</div>
</ais-index>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
</template>
<script>
import Algolia from '@/components/algolia/menu';
export default {
components: {
"algolia-menu": Algolia,
},
data() {
return {
category: 'category',
};
},
methods: {
getTemplate(result) {
console.log(result)
}
}
}
</script>
我在.card
标记内的<ais-results>
div上有一个点击侦听器,该侦听器调用了我的getTemplate
方法。但是,每当我单击该元素时,它都会产生此错误:
imageModal.vue?8d74:85未捕获的TypeError:_vm.getTemplate不是 功能 点击时(imageModal.vue?8d74:85) 在调用者处(vue.runtime.esm.js:2023) 在HTMLDivElement.fn._withTask.fn._withTask
为什么会这样?我也尝试过@click.native
,但这没用。
答案 0 :(得分:1)
问题是您为<ais-results>
组件标签使用了inline template,因此该标签中的数据引用的作用域为<ais-results>
实例。这意味着Vue正在getTemplate
组件上寻找<ais-results>
方法,但找不到它。
在这种情况下,您可以直接使用getTemplate
数据发出事件,然后在result
标记上侦听该事件,而不是直接调用<ais-results>
。
下面是一个简化的示例,其中单击嵌入式模板中的.card
div将发出一个card-click
事件(@click="$emit('card-click', result)"
)。 <ais-results>
标签具有用于该事件(@card-click="getTemplate"
)的侦听器,因此,在触发card-click
事件时,将使用getTemplate
调用result
方法数据会自动传递。
<ais-results :results-per-page="10" inline-template @card-click="getTemplate">
<div class="row">
<div class="col-6" v-for="result in results.slice(0, 5)" :key="result.objectID">
<div class="card" @click="$emit('card-click', result)">
...
</div>
</div>
</div>
</ais-results>