Czy istnieje sposób na wysyłanie akcji między dwoma modułami Vuex w przestrzeni nazw?

159

Czy jest możliwe wysłanie akcji między modułami w przestrzeni nazw?

Np. Mam moduły vuex „gameboard” i „notification”. Każdy ma przestrzeń nazw. Chciałbym wysłać akcję z planszy do modułu powiadomień.

Pomyślałem, że mógłbym użyć nazwy modułu w nazwie akcji wysyłki w następujący sposób:

// store/modules/gameboard.js
const actions = {
    myaction ({dispatch}) {
        ...
        dispatch('notification/triggerSelfDismissingNotifcation', {...})
    }
}

// store/modules/notification.js
const actions = {
    triggerSelfDismissingNotification (context, payload) {
        ...
    }
}

Ale kiedy próbuję to zrobić, otrzymuję błędy, które sprawiają, że Vuex próbuje wywołać akcję w moim module planszy:

[vuex] nieznany typ akcji lokalnej: notification / triggerSelfDismissingNotification, typ globalny: gameboard / notification / triggerSelfDismissingNotification

Czy istnieje sposób wysyłania z modułu vuex do modułu, czy też muszę utworzyć jakiś rodzaj mostu w głównej instancji vuex?

Chris Schmitz
źródło

Odpowiedzi:

343

Musisz tylko określić, że wysyłasz z kontekstu głównego:

// from the gameboard.js vuex module
dispatch('notification/triggerSelfDismissingNotifcation', {...}, {root:true})

Teraz, gdy wysyłka dotrze do katalogu głównego, będzie miała poprawną ścieżkę przestrzeni nazw do modułu powiadomień (względem wystąpienia głównego).

Jest to przy założeniu, że masz ustawione namespaced: truena vuex moduł sklepu.

Jake
źródło
39
To jedyny hit w internecie dotyczący moich poszukiwań rozwiązania. Dzięki za odpowiedź.
Peter Roehlen
8
Aby być uczciwym, jest to udokumentowane tutaj vuex.vuejs.org/en/modules.html w sekcji „Dostęp do zasobów globalnych w modułach z przestrzenią nazw”. Chociaż jest to trochę niezręczne.
Jake,
2
Uwielbiam vue, ale wydaje mi się, że vuex dodaje więcej poziomów trudności, zamiast je upraszczać. Teraz wiem, że nie jest to celem vuex, ale czy nie jest to denerwujące, że zawsze muszę być świadomy pewnych konwencji, takich jak w tym przykładzie notification/trigger, to jeśli chcę, aby było trochę bardziej ogólne ${NOTIF_TYPE_NAME}/${NOTIF_TRIGGER_ACTION}, nadal potrzebuję ukośnika, a nawet stworzyć do tego funkcję pomocniczą, czuję, że gdy chcę, aby moja aplikacja była bardziej modułowa, płacę znacznie więcej niż otrzymuję. To jest moja opinia
Dima Gimburg
11
Możesz użyć this.dispatch. Nie potrzeba {root: true}. To jest globalne.
MKatleast3
6
Nie, musisz użyć {root: true}. Przypadek, który miałeś na myśli, to prawdopodobnie wysyłanie do modułu potomnego, który rzeczywiście (i oczywiście) nie potrzebuje tej flagi.
kursus
0

Jak mencioned @ MKatleast3

Możesz użyć this.dispatch. Nie wymaga {root: true}opcji wysyłki. To jest globalne.

Slowaways
źródło