Vue JS | создать новый ключ значение в динамическом построенном массиве ($ ajax)

#javascript #ajax #vue.js #children

#javascript #ajax #vue.js #дочерние элементы

Вопрос:

Чего мы пытаемся достичь, так это календаря в Vue.js календарь получает значения с помощью вызова $ajax. После этого я хотел бы манипулировать некоторыми дочерними данными в vue.js .

Я трачу более 2 часов, чтобы найти потенциальный метод для использования этого, однако, похоже, я не могу найти способ настроить таргетинг на свойство в динамических дочерних элементах объекта данных.

Последнее, что я пробовал, это использовать вызов ‘$ refs’, этот вид делает то, что мне нужно. Но я думаю, что я не могу таким образом манипулировать дочерними данными.

Мой объект vue на данный момент выглядит следующим образом:

 var app = new Vue({
        el: '#aankomende-week',
        data: {
            calendar: ''
        },
        methods: {
            deleteAll(){
                app.calendar = '';
            },
            callAJAX() {
                $.post(
                    '/ajax/calendar',
                    '',
                    function (response) {
                        app.calendar = response;
                    },
                    'json'
                );
                console.log(this.$refs);
            }
        },
        created: function(){
            this.callAJAX();
        }

    });
  

И мой шаблон выглядит следующим образом:

введите описание изображения здесь

И мой массив данных выглядит как:

введите описание изображения здесь

есть ли способ, которым я могу установить новое свойство, что-то вроде:

 this.calendar.events.[child].totalTime = this.calender.events.[child].end - this.calender.events.[child].start;

this.calender.events.[index].totalTime = this.calender.events.[index].end - this.calender.events.[index].start;

this.calender.events.[anything].totalTime = this.calender.events.[anything].end - this.calender.events.[anything].start;
  

Было бы здорово иметь это в наблюдателе (так что, если какие-либо значения изменятся, он снова создаст / вычислит ключ массива)

Комментарии:

1. Можете ли вы пересмотреть свои ожидания от решения?

2. Является ли Vue.set(this.calender, attrName, attrValue) тем, что вы ищете? vuejs.org/v2/api/#Vue-set

3. @Estradiaz ну, я не уверен.. я хочу установить значение для каждого дочернего элемента в массиве .. поэтому я не уверен, как я могу использовать набор для каждого дочернего элемента и добавить ключ значение ко всем из них.

4. Для достижения этого можно использовать map или forEach , если данные представляют собой массив.

Ответ №1:

Учитывая, что app.calendar.events это массив..

 var app = new Vue({
        el: '#aankomende-week',
        data: {
            calendar: ''
        },
        methods: {
            deleteAll(){
                app.calendar = '';
            },
            callAJAX() {
                $.post(
                    '/ajax/calendar',
                    '',
                    function (response) {
                        app.calendar = response;
                        this.addNewData();
                    },
                    'json'
                );
            },
            addNewData() {
                app.calendar.events.map(function(event) {
                    event.data = 'some value';
                });
            }
        },
        created: function(){
            this.callAJAX();
        }

    });
  

Я добавил в ваш ответ вызов метода с именем addNewData . Я добавил этот метод в объект methods. Он выполняет map над массивом событий, и для каждого события вы можете добавить определенное свойство. Он вернет массив с добавленным свойством. Больше информации о карте здесь

Комментарии:

1. Спасибо! это было оно. Потрясающе, я могу использовать такого рода функции вместе с Vue для изменения всех свойств данных, которые мне нужны

2. Помните, Vue — это просто JavaScript 😉 Рад, что смог помочь.

Ответ №2:

Vue.set( target, key, value ) Аргументы:

{Object | Array} цель

{string | number} Клавиша

{any} значение

Возвращает: установленное значение.

Использование:

Добавляет свойство к реактивному объекту, гарантируя, что новое свойство также будет реактивным, поэтому запускает обновления просмотра. Это должно использоваться для добавления новых свойств к реактивным объектам, поскольку Vue не может обнаружить обычные добавления свойств (например, this.myObject.newProperty = 'hi' ).

Целевой объект не может быть экземпляром Vue или корневым объектом данных экземпляра Vue.

Документы Vue

Ответ №3:

В вашем коде 2 проблемы

1. Вы устанавливаете значение ответа ajax с помощью app.calendar , вы должны использовать this.calendar=response

2. Во-вторых, вам нужно использовать Vue.set для добавления нового свойства или фактически вставить значение в массив. Подробнее об этом здесь. Одно замечание по этому поводу: вы не можете добавлять свойства данных верхнего уровня с помощью Vue.set.

Комментарии:

1. 1. После того, как я установил для него значение this.calendar, я все еще могу видеть объект в своей консоли .. шаблон, похоже, больше не повторяет значения, хотя .. есть идеи, почему? 2. Ну .. мне нужно новое значение ключ в каждом дочернем элементе … после прочтения документации я все еще не уверен, как это сделать.

2. 1. Вы ошибаетесь. Он не должен использовать «это». Проверьте, что он создает там функцию с другим контекстом. Таким образом, функция Ajax может изменить его контекст на другой. 2. Набор Vue требуется только для добавления и удаления свойств. Vue добавляет polyfil ко всем функциям массива. Итак, использование массива с Vue.set неверно! Он должен просто вызвать push или что-то подобное.