#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.
Ответ №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 или что-то подобное.