еще раз о дублировании элемента удаления события - PullRequest
0 голосов
/ 06 июня 2019

Я спросил здесь У меня есть дублирование события после перемещения действия в объекте хранилища о дублировании события и предложенное решение выглядело хорошим, но после того, как я вернулся к этому вопросу, у меня возникли те же проблемы с успехомдубликаты сообщений.В моем файле vue контейнера MainApp.vue я установил обработчик события:

<template>
   <body class="account-body">
   <v-dialog/>

   <MainHeader></MainHeader>
   <div class="content p-0 m-0" style="width: 100% !important; margin: auto !important;">
      <notifications group="wiznext_notification"/>
      <router-view></router-view>
   </div>
   </body>

</template>

<script>

    import {bus} from '../../app';
    import MainHeader from './MainHeader.vue';
    import { deleteFromUserListsKey, runDeleteFromUserLists } from "../../helpers/commonFuncs";

    export default {
        name: 'main-app',
        components: {MainHeader},
        created() {
            // console.log('resources/js/components/Horizontal/MainApp.vue Component created.')
        },
        mounted() {
            console.log('resources/js/components/Horizontal/MainApp.vue Component MOUNTED.')
            bus.$on('dialog_confirmed', (paramsArray) => {
                // alert( "resources/js/components/Horizontal/MainApp.vue dialog_confirmed  paramsArray::"+var_dump(paramsArray) )
                if (paramsArray.key == this.deleteFromUserListsKey(paramsArray.user_list_id)) {
                    this.runDeleteFromUserLists(paramsArray.user_list_id, paramsArray.user_id, paramsArray.index);
                }
            })
        },

        methods: {
            deleteFromUserListsKey, runDeleteFromUserLists
        }

    }

</script>

Я вызываю диалог подтверждения с помощью click.prevent:

<div class="card-footer">
   <div class="float-right">
      <i :class="'mr-2 '+getHeaderIcon('delete')" @click.prevent="confirmDeleteUserList( nextUserList.id, currentLoggedUser.id,
      nextUserList.title, index );" title="Delete"></i>
   </div>

из моих ресурсов смешивания / js / appMixin.js запускается, и если пользователь выбирает подтвердить, что событие dialog_confirmed отправляется:

confirmMsg: function (question, paramsArray, title, bus) {
    this.$modal.show('dialog', {
        title: title,
        text: question,
        buttons: [
            {
                title: 'Yes',
                default: true,    // Will be triggered by default if 'Enter' pressed.
                handler: () => {
                    bus.$emit('dialog_confirmed', paramsArray);
                    this.$modal.hide('dialog')
                }
            },
            {
                title: '',       // Button title
                handler: () => {
                } // Button click handler
            },
            {
                title: 'Cancel'
            }
        ]
    })
},

В моем магазине ресурсы / js / store.js OI определяют метод удаления элементов и запуска событий:

userListDelete(context, paramsArray ) {
    axios({
        method: ( 'delete' ),
        url: this.getters.apiUrl + '/personal/user-lists/' + paramsArray.user_list_id,
    }).then((response) => {
        let L = this.getters.userLists.length
        for (var I = 0; I < L; I++) {
            if (response.data.id == this.getters.userLists[I].id) {
                this.getters.userLists.splice(this.getters.userLists.indexOf(this.getters.userLists[I]), 1)
                context.commit('refreshUserLists', this.getters.userLists);
                break;
            }
        }

        bus.$emit( 'onUserListDeleteSuccess', response );
    }).catch((error) => {
        bus.$emit('onUserListDeleteFailure', error);
    });

}, // userListDelete(context, paramsArray ) { 

В файле list.vue, из которого удаляются элементы, я определяю всплывающие сообщения:

mounted() {
    console.log("resources/js/components/Horizontal/personal/userLists.vue Mounted()::")
    bus.$on('onUserListDeleteSuccess', (response) => {
        this.is_page_updating = false
        this.showPopupMessage("User lists", 'User\'s list was successfully deleted!', 'success');
        // bus.$off('onUserListDeleteSuccess')
    })

    bus.$on('onUserListDeleteFailure', (error) => {
        this.is_page_updating = false

        if (error.error_code != 11) {
            this.$setLaravelValidationErrorsFromResponse(error.message);
            this.showRunTimeError(error, this);
            this.showPopupMessage("User lists", 'Error adding user\'s list !', 'error');
        }
        // bus.$off('onUserListDeleteFailure')
    })
    this.is_page_loaded = true
    this.setAppTitle("Personal", 'User\'s lists', bus);
}, // mounted() {

Я показываю сообщения в событии монтирования всех страниц и вижу, что событие монтирования MainApp.vue вызывается только один раз и когдаоткрывается другая страница. Я вижу относительное сообщение в консоли.Погуглил я нашел метод bus. $ Off, но он мне не помогает, в любом случае у меня есть несколько дублированных сообщений, особенно если я на разных страницах.

Как исправить эти дублированные сообщения?

Спасибо!

1 Ответ

0 голосов
/ 10 июня 2019

Я нашел решение по адресу: Прекратить получать события от уничтоженного дочернего компонента

Так что создание / удаление событий, таких как

created() {
    ...
    bus.$on('onUserListDeleteSuccess', (response) => {
        this.is_page_updating = false
        this.showPopupMessage("User lists", 'User\'s list was successfully deleted!', 'success');
    })

}, //  created() {

beforeDestroy(){
    bus.$off( 'onUserListDeleteSuccess' )
},

, работает нормально для меня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...