2016-10-03 2 views
1

У меня есть ApiService(), что я абстрагирую свои вызовы API. Я хотел бы dispatch('SET_BUSY') и dispatch('SET_NOT_BUSY') приложения уровня мутации внутри службы, но я получаю следующее сообщение об ошибке:Отказоустойчивые мутации из служебного файла

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); 
    }); 
}; 

ответ

1

Функция действия ожидает, что магазин экземпляр как первый параметр. Обычно это выполняется Vuex автоматически.

При использовании действия в случае Вью, способ ее выполнения в Vuex 1 выглядит следующим образом:

import { setAppMode } from './actions' 

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

Теперь вы можете использовать this.setAppMode() и иметь магазин автоматически доступны в качестве первого аргумента.

Примечание: Вы также должны установить store свойство VM

import store from `./store` 

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

Если store не был установлен на экземпляр виртуальной машины, вы можете передать его в качестве параметра, вручную:

this.setAppMode(store); 
+0

'' vue ":"^1.0.21 "и' "vuex": "^ 1.0.0-rc.2" '. У меня есть действие под названием 'setAppMode()', которое я импортирую в компонент 'App.vue' и ссылку 'this.setAppMode()'. – Donnie

+0

Возможно, вы добавили 'setAppMode' в' методы' vm ... Вместо этого вы должны использовать 'vuex'. Я добавил дополнительную информацию в ответ. Я надеюсь, что это помогает. –

+0

О, я понимаю, что тебе нужно. Да, это метод, который я использовал для импорта и использования его в 'App.vue', который работает (помимо отправки). – Donnie

Смежные вопросы