Задать вопрос
  • Как проверить, завершилось ли действие, вызванное из другого компонента?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Да не надо ничего проверять. Что у вас является следствием завершившегося действия? - наличие нужных данных. Сделайте соответствующий геттер, и повесьте на экземпляр компонента v-if с этим геттером. Пока данных нет - экземпляр компонента не будет рендериться, а значит и мутация, требующая отсутствующих данных, тоже вызвана не будет, а значит и ошибки не будет.
    Ответ написан
    Комментировать
  • Как проверить, завершилось ли действие, вызванное из другого компонента?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, dispatch возвращает промис, притом если экшен возвращает промис, то dispatch вернет именно его
    То есть можем сделать примерно следующее:
    // экшн:
    InitChatSystem() {    
            return axios.get('/api/initChat')
                .then(res => {
                    this.commit('chat/initArticles', res.data.articles);                
                    this.commit('chat/initNotifications', res.data.notifications);               
                })
                .catch(err => {
                    console.log(err);                
                })
    },
    
    
    // хук:
    created() {
      this.$store.dispatch('chat/InitChatSystem').then(() => {
        // тут запускаем нашу мутацию
        // но как я понял, она в дочернем компоненте
        // нужно навесить ref на компонент, а в самом компоненте сделать метод запуска
        // а здесь будет что-то типа:
        this.$refs.child.run();
      });
    },


    Второй вариант, чисто на возможностях Vuex:
    // дождемся, когда в state.articles появятся данные
    activated() {            
      const unwatch = this.$store.watch(state => state.articles.length, length => {
        if(length === 0) { return; }
        unwatch();
        this.$store.commit('chat/openConversationArticle', this.article_id);
      });
    },
    Ответ написан
    Комментировать
  • Как отследить scroll страницы только для одного vue компонента который сохраняет состояние(keep-alive)?

    0xD34F
    @0xD34F Куратор тега Vue.js
    В компоненте так же прописано удаление "EventListener", но так как компонент сохраняет своё состояние (keep-alive), данный метод не удаляет "слушателя скролла".

    Как подсказывает документация, для keep-alive компонентов доступны хуки activated и deactivated - попробуйте вешать и снимать обработчик скролла в них.
    Ответ написан
    1 комментарий
  • Как удалять прикрепленные файлы к посту при редактировании поста?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Вариантов 2: (код не пишу - описываю принцип)
    1) Аяксом - при клике на некий элемент вызывается запрос к экшену удаления изображения, в параметрах передаете ид объекта изображения(вы же в отдельной таблице храните картинки и связываете их по парент_ид с записью, надеюсь?). Создаете объект image по id, вызываете метод удаления. На фронте получаете ответ сервера в аякс коллбэк, при успешном удалении выпиливаете из ДОМ картинку и элементы управления к ней.
    Плюс решения - быстро и без перезагрузки.
    Минус - иногда удаляют картинку случайно, в данном случае(в отличие от варианта 2) откат невозможен.
    2) В хидден поле пишете айдишники удаляемых картинок по клику на иконку удаления(и соответственно выпиливаете картинку из ДОМ), по субмиту на сервере проверяете поле, вытаскиваете из него айдишники картинок, далее циклом как в варианте 1.
    Плюс решения - до субмита формы реального удаления файлов не будет. То есть все можно откатить просто сделав рефреш страницы.
    Минус - ... для удаления нужно сделать субмит, это не всегда удобно если вы просто хотите удалить пару картинок из записи. Выглядит менее юзерфрендли.
    Ответ написан
    1 комментарий