这是子组件:
Vue.component("training-edit", {
template: "#training-edit-template",
props: ["show"],
data: function () {
return {
form: new Form(),
isWorking: false
}
},
watch: {
show: function (val) {
if (val) {
$("#editTrainingModal").modal("show");
} else {
$("#editTrainingModal").modal("hide");
}
}
},
methods: {
onCancel: function () {
this.$emit("doneEditing");
}
}
});
这是父母:
new Vue({
el: "#trainingEditContainer",
data: {
isWorking: false,
showEditTraining: false
},
methods: {
onEdit: function (e) {
e.preventDefault();
this.showEditTraining = true;
},
doneEditing: function () {
this.showEditTraining = false;
}
}
});
HTML:
<div id="trainingEditContainer" class="row">
// unrelated stuff here
<training-edit v-bind:show="showEditTraining"></training-edit>
</div>
<script id="training-edit-template" type="x-template">
<modal-right modalId="editTrainingModal">
<div class="modal-header">
<button type="button" class="close" v-on:click="onCancel" aria-label="close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title">Edit Training</h4>
</div>
@Html.Partial("Partial/_EditPartial")
</modal-right>
</script>
我可以在Chrome的Vue开发人员工具中看到该事件正在发出但由于某种原因,父母没有听到它,并且永远不会调用doneEditing
函数。我错过了一些明显的东西吗?
答案 0 :(得分:3)
首先,我建议您将活动名称更改为done-editing
。
this.$emit("done-editing")
这是因为HTML中的属性不区分大小写,如果您要将一些模板呈现给DOM,那么avoid camelCased names就好了。请注意,如果您在字符串中定义模板或使用单个文件组件,则不适用。
然后你需要在组件上听它。
<training-edit @done-editing="doneEditing" v-bind:show="showEditTraining">
当您从组件发出事件时,父级必须显式侦听该事件。