Vue компонент prop `undefined` при вызове из обратного вызова наблюдателя - PullRequest
0 голосов
/ 21 января 2019

Я писал клиент Vue для API инструктора для сайта электронного обучения, который выбирает связанные темы вопросов и ответов для каждого курса, преподаваемого этим инструктором.

Клиент сначала заполняет список курсов.

Затем, когда щелкают курс, идентификатор этого курса передается дочернему компоненту в виде реквизита, называемого courseid, поэтому дочерний компонент сам может выполнить поиск API, чтобы получить потоки для этого курса, используя этот ID.

Дочерний компонент содержит метод, который выполняет запрос API для получения потоков вопросов и ответов с именем getThreads, используя в качестве параметра этого запроса пропу courseid.

Наконец, наблюдатель наблюдает за опорой courseid и вызывает getThreads, если она меняется. По крайней мере, так должно быть.

Когда я щелкаю курс в списке курсов родительского компонента, идентификатор этого курса успешно передается дочернему компоненту как реквизит courseid (реквизит courseid отображается с правильным значением на панели Vue DevTools ), но консоль браузера отображает следующее:

[Vue warn]: Error in callback for watcher "courseid": "ReferenceError: courseid is not defined"

Вот содержимое раздела <script> вышеупомянутого дочернего элемента:

<script>
import axios from 'axios';

export default {
  name: 'qAndAThread',
  data() {
    return {
      axiosResult: [],
      isLoading: false,
    };
  },
  props: {
    courseid:{
      default: '',
      type: String
    },
  watch: { 
    courseid: function () {
      this.getThreads();
    },
  },
  methods: {
    getThreads: function makeRequest() {
      this.isLoading = true;
      const token = '*redacted*';
      const instance = axios.create({
        baseURL: '*redacted*',
        timeout: 100000,
        headers: {
          Accept: '*/*',
          'Content-Type': 'application/json;charset=utf-8',
          Authorization: `bearer ${token}`,
        },
      });

      instance
        .get(`/courses/${courseid}/questions/?page_size=200`)
        .then((response) => {
          this.axiosResult = response.data;
          this.isLoading = false;
          this.unread = this.axiosResult.count;
        })
        .catch((error) => {
          //console.log(error);
          this.axiosResult = error;
          this.isLoading = false;
        });
    },
  },
};
</script>

Любая предложенная помощь будет с благодарностью получена!

1 Ответ

0 голосов
/ 21 января 2019
.get(`/courses/${courseid}/questions/?page_size=200`)

должно быть

.get(`/courses/${this.courseid}/questions/?page_size=200`)

courseid на вашем объекте, поэтому, если вы отключите this, вы получите undefined.Если вы выполните this.courseid, это должно сработать.

Я не в курсе того, как vue поддерживает область действия, но вам также может понадобиться сделать следующее:

watch: { 
    courseid: function () {
      this.getThreads();
    },
  },

можетдолжно быть

watch: { 
    courseid: function () {
      this.getThreads.bind(this);
    },
  },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...