Vuejs: невозможно получить доступ к (вычисляемым) объектам в цикле вычисляемых свойств - PullRequest
0 голосов
/ 25 сентября 2018

Возможно очевидный, но у меня есть Vue Single File Component , подобный этому:

<template>
...
</template>

<script>
    export default {
        props: [ 'matches', 'results' ],

        computed: {

           formattedMatches: function () {
                let rows = [];
                this.matches.forEach(function($match, $i) {
                    rows[$i] = {
                        id: $i + 1,
                        title: $match[0] + ' ' + $match[1]
                    };
                });
                return rows;
            },

            formattedResults: function () {
                let rows = [];
                this.results.forEach(function($resultRow, $i) {
                    rows[$i] = {
                        id: $i + 1,
                        title: this.formattedMatches[$i]     
 // Error in render: "TypeError: Cannot read property 'formattedMatches' of undefined"
                    };
                });
                return rows;
            },
    ...
</script>

Ошибка появляется также, если я пытаюсь с this.matches, а не только сthis.formattedMatches.Я предполагаю, что это вопрос переменных областей в классах и методах, но я даже не знаю, есть ли другой лучший способ или шаблон для достижения того же поведения.

Есть идеи?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Нашли решение на основе этого другого решения на StackOverflow.Как говорится, «this внутри обратного вызова относится к самому обратному вызову (точнее, как указано выше, к контексту выполнения обратного вызова), а не к экземпляру Vue. Если вы хотите получить к нему доступ, вам либо нужноназначить это что-то вне обратного вызова".

Так что в моем случае ...

...
formattedResults: function () {
     let self = this;
     let rows = [];
     this.results.forEach(function($resultRow, $i) {
         rows[$i] = {
              id: $i + 1,
              title: self.formattedMatches[$i]     
         };
     });
     return rows;
},
...

... делает свое дело.В любом случае, спасибо!

0 голосов
/ 25 сентября 2018

this имеет другой контекст в анонимной функции forEach.Самое простое решение - использовать функцию обозначения стрелки.

this.results.forEach(($resultRow, $i) => {
    rows[$i] = {
        id: $i + 1,
        title: this.formattedMatches[$i]
    };
});
...