Vue.js + vue-resource + vue-router = Ошибка лексического объявления?

При попытке использовать Vue.js с vue-resource и vue-router отображается ошибка:

ReferenceError: невозможно получить доступ к лексическому объявлению `vm' перед инициализацией

Насколько я отследил ошибку, она появляется только тогда, когда страница загружается с начальным маршрутом, например. test.com/#/files (ошибка) и test.com/ (нет ошибки). Если весь код requestDirectory() заменить на next(), ошибка отображаться не будет. Таким образом, кажется, что он наследует структуру кода. Любые идеи?

const routerComponents = {
    home: {     template: '<p>Home ...</p>' },
    files: { template: '<p>Files</p>' }
};

function requestDirectory(to, from, next) {
    console.log("Loading files in ...");
    vm.$http.post('/api/dir', {dir: 'photos'}).then((res) => {
        console.log("done");
        next()
    }, (err) => {});
}

const router = new VueRouter({
    routes: [
        { path: '/', component: routerComponents.home },
        { path: '/files', component: routerComponents.files, beforeEnter: requestDirectory }
    ]
});

const vm = new Vue({
    data: {
        title: 'Home'
    },
    router: router
});

window.onload = function() {
    vm.$mount('#app');
};

person Bernd    schedule 12.01.2017    source источник


Ответы (2)


Вы не можете получить доступ к vm или this в обратном вызове beforeEnter, потому что в этот момент экземпляр компонента еще не создан. Попробуйте переместить свой код в одно из событий экземпляра компонента, таких как created.

ОБНОВЛЕНО

Просто замените vm.$http глобальным ярлыком Vue.http.

Найдено в документации здесь.

person Panama Prophet    schedule 12.01.2017
comment
Я прочитал это, но это означало бы, что нельзя использовать vue-router и vue-resource?? - person Bernd; 12.01.2017
comment
существуют разные типы компонентов - компоненты маршрутизатора - это все о маршрутизации, как я правильно понимаю. В любом случае, вы попытаетесь получить к нему глобальный доступ через Vue.http вместо vm.$http? - person Panama Prophet; 12.01.2017
comment
Vue.http работает, но это приводит к новой ошибке next undefined. В общем, я разместил HTTP-запрос в обратном вызове компонентов created, и он работает. - person Bernd; 13.01.2017

В этом разница между var и const/let в ES6.

ES6 по-прежнему будет поднимать переменную let/const в начало блока. Однако использование переменной перед объявлением const/let приведет к ошибке ReferenceError. Переменная находится во «временной мертвой зоне» с начала блока до обработки объявления.

Дополнительную информацию см. в Спецификации языка ECMAScript® 2017 13.3.1 Пусть и Объявления констант

person djones    schedule 12.01.2017