#javascript #vue.js
#javascript #vue.js
Вопрос:
У меня есть список, подобный этому
<div class="list-group entity-list">
<a v-for="entity in master.data"
:class="['entity list-group-item', entity.selected ? 'selected' : '']"
@click="itemselect(entity)"
>
@{{entity.name}}
</a>
</div>
Список отображается так, как ожидалось. Связанный объект добавляется в качестве реквизита к внешнему компоненту, подобному этому.
<my-compontent :entityname="customers" :master="{{json_encode($customers->toArray())}}" inline-template>
Как вы можете видеть, это должен быть список клиентов. Чтобы указать, выбран ли клиент, я хочу установить атрибут «выбранный» при нажатии. Однако, похоже, это не работает, если у связанного объекта по умолчанию нет свойства select.
methods: {
itemselect: function(item) {
this.master.data.forEach(function(el) {
el.selected = false;
});
item.selected = true;
}
}
Показанный метод, похоже, не работает / не вызывает изменения
Ответ №1:
Если вы хотите изменить данные, передаваемые с помощью prop, то вам нужно скопировать их, vue выдаст предупреждение, если вы попытаетесь напрямую изменить prop. Я бы, вероятно, справился с этим, выполнив что-то вроде:
new Vue({
el: '#app',
created() {
// Assume this is passed in by a prop
var myData = {master: {
data: [{
name: 'foo'
}, {
name: 'bar'
}, {
name: 'baz'
}]
}};
// Copy data from prop
myData.master.data.forEach(el => {
var obj = {
name: el.name,
selected: false
};
this.master.data.push(obj);
});
},
methods: {
itemselect(item) {
this.master.data.forEach(el => {
// if this element is selected set to true
el['selected'] = (el.name == item.name);
});
}
},
data() {
return {
master: {
data: []
}
}
}
});
Я просто издевался над фактическими поступающими данными, но, очевидно, это добавило бы это в prop и передало бы его вашему компоненту как обычно. Вот jsFiddle:https://jsfiddle.net/xswtfkaf /
Ответ №2:
Вместо изменения ваших основных данных отслеживайте выбор в модели, используя $index
предполагая, что вы не переупорядочиваете свои master.data
<div class="list-group entity-list">
<a v-for="entity in master.data"
:class="eClass[$index]"
@click="itemselect($index)"
>
@{{entity.name}}
</a>
</div>
methods: {
itemselect: function(idx) {
if ( 0 > this.selected.indexOf(idx) ) {
this.selected.push(idx)
}
}
}
computed : {
eClass : function () {
var r=[];
for (var i= 0;c=this.master.data[i]; i) {
r[i] = {'selected': -1 < this.selected.indexOf(i),'entity list-group-item':true};
}
return r;
}
}
если entity
имеет уникальный идентификатор
<div class="list-group entity-list">
<a v-for="entity in master.data"
:class="eClass[entity.id]"
@click="itemselect(entity.id)"
>
@{{entity.name}}
</a>
</div>
methods: {
itemselect: function(idx) {
if ( 0 > this.selected.indexOf(idx) ) {
this.selected.push(idx)
}
}
}
computed : {
eClass : function () {
var r={};
for (var i= 0;c=this.master.data[i]; i) {
r[c.id] = {'selected': -1 < this.selected.indexOf(c.id),'entity list-group-item':true};
}
return r;
}
}