是否可以将$ event从cshtml传递到Vue.component?

时间:2019-12-20 06:18:01

标签: javascript vue.js razor emit

我想将事件传递到我的vue.componenet中,我尝试了不同的方法,但是都收到了“ TypeError:无法读取未定义的属性'preventDefault'”

这是我的Vue.comonenet:

Vue.component('jl-asset-list', {
created() {
    console.log(this.asset);
    console.log(this.canModify);
    console.log(this.editSiteAssetAllowed);
    console.log(this.event);
},
props: {
    hasCompleteTask: {
        default: false,
        type: Boolean
    },
    asset: {
        type: Object,
        required: true
    }
},
methods: {
    EditSiteAsset(asset, event) {
        event.preventDefault();
        event.stopPropagation();

        var context = this;
        context.SelectedSiteAsset = asset;

        var target = event.target || event.srcElement;
        var icon = $(target).closest('.jobasset_edit');

        icon.prop('disabled', true);
        this.$emit('edit-site-asset', asset);
    },
    EditJobAsset(asset) {
        this.$emit('edit-job-asset', asset);
    },
    HighlightAsset(asset) {
        this.$emit('highlight-asset', asset);
    }
}

我的CSHTML:

<jl-asset-list v-for="(siteAsset, index) in FilteredSiteAssets" 
                                           inline-template 
                                           v-bind:asset="siteAsset" 
                                           v-bind:canModify="Model.CanModify"
                                           v-bind:editSiteAssetAllowed="Model.EditSiteAssetAllowed"
                                           v-on:highlight-asset="HighlightAsset" 
                                           v-on:edit-site-asset="EditSiteAsset">
                                @Html.Partial("~/Views/Asset/Templates/_AssestList.cshtml")
                            </jl-asset-list>

我的模板:

<a v-on:click="EditSiteAsset(asset)" 
       class="jobasset_edit jl-icon-orange" data-toggle="tooltip" data-placement="top" data-original-title="Edit">
        <i class="mdi mdi-pencil-circle mdi-24px"></i>
    </a>

如果我在v-on中使用EditSiteAsset($ event),并且在vue.component中,方法是this。$ emit('edit-site-asset',asset);,它也将无法工作。

我的方法EditSiteEvent()需要一个事件才能操作

EditSiteAsset: function (data, event) {
        event.preventDefault();
        event.stopPropagation();

        var context = this;
        context.SelectedSiteAsset = data;

        var target = event.target || event.srcElement;
        var icon = $(target).closest('.jobasset_edit');

        icon.prop('disabled', true);

        GetSwitchModalPartial(
            '/Asset/UpdateSiteAsset?siteId=' + context.Model.SiteId + '&id=' + data.Id,
            { forJobAsset: true },
            function (data) {
                icon.prop('disabled', false);
            });
        return false;
    },

1 个答案:

答案 0 :(得分:0)

    <a v-on:click="EditSiteAsset(asset, $event)">
        <i class="mdi mdi-pencil-circle mdi-24px"></i>
    </a>

$event不是经典Vue术语中的“ prop”,它只是设置内置DOM事件侦听器时可以用来传递DOM事件的特殊关键字

...此外,您可以从事件处理程序中删除以下代码

event.preventDefault();
event.stopPropagation();

如果您像这样使用event modifiers

    <a v-on:click.prevent.stop="EditSiteAsset(asset, $event)">
        <i class="mdi mdi-pencil-circle mdi-24px"></i>
    </a>