父母不听孩子 $emit - VueJS

Qui*_*ver 5 javascript vue.js vue-component

这是子组件:

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");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这是家长:

new Vue({
    el: "#trainingEditContainer",
    data: {
        isWorking: false,
        showEditTraining: false
    },
    methods: {
        onEdit: function (e) {
            e.preventDefault();
            this.showEditTraining = true;
        },
        doneEditing: function () {
            this.showEditTraining = false; 
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

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">&times;</span></button>
            <h4 class="modal-title">Edit Training</h4>
        </div>
        @Html.Partial("Partial/_EditPartial")
    </modal-right>
</script>
Run Code Online (Sandbox Code Playgroud)

我可以在 Chrome 中的 Vue 开发人员工具中看到该事件正在发出,但由于某种原因,父级没有听到它,并且doneEditing从未调用过该函数。我在这里遗漏了一些明显的东西吗?

Ber*_*ert 6

首先,我建议您将事件的名称更改为done-editing.

this.$emit("done-editing")
Run Code Online (Sandbox Code Playgroud)

这是因为 HTML 中的属性不区分大小写,如果您将一些模板呈现给 DOM,最好避免使用驼峰命名法。请注意,如果您在字符串中定义模板或使用单个文件组件,则这不适用。

然后你需要在组件上监听它。

<training-edit @done-editing="doneEditing" v-bind:show="showEditTraining">
Run Code Online (Sandbox Code Playgroud)

当您从组件发出事件时,父级必须显式侦听该事件。