家长不听孩子$ emit - VueJS

时间:2017-12-05 18:01:53

标签: 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");
        }
    }
});

这是父母:

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

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

1 个答案:

答案 0 :(得分:3)

首先,我建议您将活动名称更改为done-editing

this.$emit("done-editing")

这是因为HTML中的属性不区分大小写,如果您要将一些模板呈现给DOM,那么avoid camelCased names就好了。请注意,如果您在字符串中定义模板或使用单个文件组件,则不适用。

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

<training-edit @done-editing="doneEditing" v-bind:show="showEditTraining">

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