Это действительно распространенный камень преткновения для разработчиков. Причина в том, что внутри функции axios ваш код находится вне области объекта, содержащего вызов метода axios. Это может быть легче увидеть, если вы переписываете этот блок кода так, как если бы он был ниже:
var vm = {
function doWork(){
axios.post('my/route', {
attribute: this.attribute //this works
}).then(function (response) {
vm.attribute = 'value'; //this works
this.attribute = 'value'; //this does not work
});
}
}
функционально эквивалентно:
var vm = {
function doWork(){
axios.post('my/route', {
attribute: this.attribute //this works
}).then(followOnWork(response));
}
}
function followOnWork(response){
vm.attribute = 'value'; //this works
this.attribute = 'value'; //this does not work
}
Как вы можете видеть в этом переработанном коде, followOnWork
работает полностью независимо от объекта vm
. Поэтому любое использование переменной this
в followOnWork
не будет относиться к объекту vm
. Где vm
- это фактическое имя объекта, и после создания объекта к нему можно получить доступ из в любом месте через переменную vm
.
Вы можете обойти эту проблему "вне области видимости", используя функцию стрелки (как упомянуто @MakarovSergey), если ES6 - вариант для вас.