這裏是我的代碼的簡化版本:Vue.js 2 - 陣列變化檢測
<template>
/* ----------------------------------------------------------
* Displays a list of templates, @click, select the template
/* ----------------------------------------------------------
<ul>
<li
v-for="form in forms.forms"
@click="selectTemplate(form)"
:key="form.id"
:class="{selected: templateSelected == form}">
<h4>{{ form.name }}</h4>
<p>{{ form.description }}</p>
</li>
</ul>
/* --------------------------------------------------------
* Displays the "Editable fields" of the selected template
/* --------------------------------------------------------
<div class="form-group" v-for="(editableField, index) in editableFields" :key="editableField.id">
<input
type="text"
class="appfield appfield-block data-to-document"
:id="'item_'+index"
:name="editableField.tag"
v-model="editableField.value">
</div>
</template>
<script>
export default {
data: function() {
return {
editableFields: [],
}
},
methods: {
selectTemplate: function (form) {
/* ------------------
* My problem is here
*/ ------------------
for (let i = 0; i < form.editable_fields.length; i++) {
this.editableFields.push(form.editable_fields[i]);
}
}
}
}
</script>
基本上我想每一次的模板用戶點擊更新陣列EditableFields。我的問題是Vuejs沒有更新顯示,因爲檢測沒有被觸發。我已閱讀文檔here,建議$設置數組或僅使用Array實例方法,如拼接和推送。
上面的代碼(帶推)工程,但數組永遠不會被清空,因此,「可編輯字段」繼續堆積起來,這不是我想要的行爲。
爲了與新的數據再次填充它之前清空陣列,我試過幾件事情,沒有運氣:
this.editableFields.splice(0, this.editableFields.length);
for (let i = 0; i < form.editable_fields.length; i++) {
this.editableFields.push(form.editable_fields[i]);
}
==>不更新顯示
for (let i = 0; i < form.editable_fields.length; i++) {
this.$set(this.editableFields, i, form.editable_fields[i]);
}
== >不更新顯示器
this.editableFields = form.editable_fields;
==>不更新顯示器
我還沒有嘗試過的一件事是設置一個全新的數組,但我不明白我該如何放置,因爲我希望用戶能夠點擊(並更改模板選擇) 不止一次。
我在這個問題上ban了幾個鐘頭,我很感激任何幫助。 提前謝謝:)!
謝謝,你是完全正確的,我的代碼的一個不相關的部分導致了錯誤。 –