2016-10-03 2 views
1

Ich habe eine ApiService(), dass ich meine API-Aufrufe abstrahieren. Ich möchte dispatch('SET_BUSY') und dispatch('SET_NOT_BUSY') app-Ebene Mutationen innerhalb des Service, aber ich bekomme die folgende Fehlermeldung:Versand Mutationen aus Servicedatei

TypeError: dispatch is not a function. (In 'dispatch('SET_BUSY')', 'dispatch' is undefined) 

/vuex/actions.js

import { ApiService } from './services'; 

export const setAppMode = function ({ dispatch }) { 
    ApiService({ 
    noun: 'Application', 
    verb: 'GetMode' 
    }, response => { 
    dispatch('SET_APP_MODE', response.Data.mode); 
    }, 
    dispatch); 
}; 

/vuex/services.js

import Vue from 'vue'; 

export const ApiService = (options = {}, callback, dispatch) => { 
    let endpoint = 'localhost/api/index.php'; 
    let parameters = options.data; 

    dispatch('SET_BUSY'); 

    Vue.http.post(endpoint, parameters, []).then((promise) => { 
    return promise.text(); 
    }, (promise) => { 
    return promise.text(); 
    }).then(response => { 
    response = JSON.parse(response); 

    dispatch('SET_NOT_BUSY'); 

    if (response.Result === 'ERROR') { 
     console.log('ERROR: ' + response.Error.Message); 
    } 

    callback(response); 
    }); 
}; 

Antwort

1

Eine Aktionsfunktion erwartet die Instanz als ersten Parameter. Dies wird normalerweise von Vuex automatisch erledigt.

Wenn eine Aktion in einer Instanz Vue verwenden, wie es in Vuex 1 zu erreichen, ist wie folgt:

import { setAppMode } from './actions' 

new Vue({ 
    vuex: { 
    actions: { 
     setAppMode 
    } 
    } 
}) 

Jetzt können Sie this.setAppMode() verwenden und den Speicher automatisch als erstes Argument haben.

Hinweis: Sie müssen auch die store Eigenschaft der VM

import store from `./store` 

// and inside the VM options: 
{ 
    store: store 
} 

Wenn store wurde eingestellt nicht auf die vm-Instanz festgelegt wurde, können Sie es als Parameter übergeben kann immer noch manuell:

this.setAppMode(store); 
+0

'" vue ":"^1.0.21 "' und '" vuex ":"^1.0.0-rc.2 "'. Ich habe eine Aktion mit dem Namen 'setAppMode()', die ich in die 'App.vue'-Komponente importiere und auf' this.setAppMode() 'referenziere. – Donnie

+0

Vielleicht hast du 'setAppMode' zu ​​den' Methoden' des vm hinzugefügt ... Du solltest stattdessen 'vuex' verwenden. Ich habe der Antwort weitere Informationen hinzugefügt. Ich hoffe, es hilft. –

+0

Oh, ich sehe was du willst. Ja, das ist die Methode, die ich verwendet habe, um sie in 'App.vue' zu ​​importieren und zu verwenden, was funktioniert (abgesehen von der Dispatch-Sache). – Donnie