Vue.js неопределенная ошибка в значении объекта при загрузке и рендеринге

1

ХОРОШО. Я не полный новичок и у меня есть Vue xp, но это подслушивает меня. Какая действительно очевидная вещь мне не хватает.

У меня есть объект, загруженный через вызов ajax внутри смонтированного метода:

job: {
  "title": "value",  
  "location": {
    "name":"HONG KONG"
  }
}

Когда я называю {{job.title}} все хорошо. Когда я вызываю {{job.location.name}}, у меня есть неопределенная ошибка, но значение отображается. Когда я вызываю {{job.location}}, я получаю объект json так, чтобы он был определен.

Aaargh! Я уверен, что это действительно просто, но не может понять, почему это не так прямо, как должно быть.

//Дополнительные

Это мой весь класс Vue

    const router = new VueRouter({
        mode: 'history',
        routes: []
    });
    const app = new Vue( {
      router,
      el: '#app',
      data: {
        job: {}
      },
      mounted: function () {
        var vm = this
        jQuery.ajax({
            url: 'https://xxx' + this.jobId,
            method: 'GET',
            success: function (data) {
                vm.job = data;
            },
            error: function (error) {
                console.log(error);
            }
        });
      },
      computed: {
        jobId: function() {
            return this.$route.query.gh_jid
        }
      }
    })
  • 0
    В этом фрагменте все в порядке. Ошибка должна быть где-то еще. Предоставить больше кода
  • 0
    Вы определяете 'job.location.name' в своем экземпляре данных? Я не уверен, что перед вашим запросом ajax появилась ошибка, поэтому предоставьте больше кода
Показать ещё 2 комментария
Теги:
vue.js

1 ответ

0
Лучший ответ

Когда ваш компонент визуализирует, он пытается получить значение из job.location.name но location не определено до завершения запроса ajax. Поэтому я предполагаю, что ошибка - это вид Cannot read property 'name' of undefined.

Чтобы исправить это, вы можете определить computed свойство locationName и вернуть, например, пустую строку, когда еще нет загруженного объекта задания:

computed:{
//...
    locationName() {
       return this.job.location ? this.job.location.name : '';
    }
}

Или вы можете определить вычисленное для location и вернуть пустой объект, если нет места, или вы можете просто добавить пустой объект местоположения к вашим исходным данным (если вы уверены, что ваш ответ API всегда имеет location), например job: { location: {}} все способы исправить вашу проблему.

Также есть способ исправить его с помощью директивы v-if в вашем шаблоне:

<div v-if="job.location">
   {{ job.location.name }}
   <!-- other location related stuff -->
</div>
  • 0
    Спасибо за ответ. Я понимаю логику ответа, но он не учитывает, что job.title доступен и отображается без проблем.
  • 0
    @ Dr.ifle title работает, потому что это свойство объекта job, которое существует всегда, и job.title просто возвращает undefined, если нет заголовка prop без какой-либо ошибки. Ваше местоположение является вложенным объектом, и ошибка связана со свойствами объекта местоположения.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню