我在页面上有几个组件,并且发现对父对象的更新反映在其中一个组件中,而没有反映在另一个组件中。
主页PatientEditor.vue
包括以下组件:
<notes-editor v-model="pt" />
<chart-completion v-model="pt" arrange="horiz" />
并具有以下脚本:
module.exports = {
props: ["pt"]
};
因此,pt
对象位于父对象中,并且作为v-model
传递给多个组件
组件ChartCompletion.vue
运行良好。里面有这些。
module.exports = {
props: ["value", "arrange"],
computed: {
completed_notes: function() {
return this.value.notes.filter(function(note) {
return note.signed_at;
}).length;
},
我的问题孩子是NotesEditor.vue
模板,其中包含以下内容:
module.exports = {
props: ["value"],
computed: {
completed_notes: function() {
return this.value.notes.filter(function(note) {
return note.signed_at;
}).length;
}
},
不确定是否重要,但是notes
对象是通过另一个组件中的ajax调用填充的,例如:
this.value.notes.splice(0, this.value.notes.length, ...response.body.notes);
this.$emit("input", this.value);
太棒了,这就是问题所在。
更新this.value.notes
时,结果将在ChartCompletion
组件中看到,但不会在NotesEditor
组件中看到。当我在chrome中使用Vue调试器时,我可以看到notes对象已更改,但是由于某种原因,即使ChartCompletion
组件中的定义相同,calculated属性也不会重新触发。另外,我在v-for
中有一个NotesEditor
也没有变化。
调试此问题的最佳方法是什么?
编辑1-包括NotesEditor
组件
<template>
<span>
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Status</th>
<th>Audio</th>
<th>Text</th>
</tr>
</thead>
<tbody>
<tr v-for="n in value.notes" :key="n.id">
<th>{{n.created_at}}</th>
<td>{{n.note_status_id}}</td>
<td>
<span v-if="n.audio_length > 0">
<audio controls="controls" preload="none">
<source :src="audioURL(n.id)" type="audio/webm"> Your browser does not support the audio element.
</audio>
({{n.audio_length}}s)
</span>
<span v-else>
None
</span>
</td>
<td>
<span v-if="n.note_text">
<button data-toggle="tooltip" :title="n.note_text" class="btn btn-outline-primary btn-sm" @click.prevent="openChartEditor(n.id)">
<span class="glyphicon glyphicon-edit"></span> Edit Note ({{ n.note_text.length }} chars)
</button>
</span>
<span v-else>
<button class="btn btn-primary btn-sm" @click.prevent="openChartEditor(n.id)">
<span class="glyphicon glyphicon-pencil"></span> Create Note
</button>
</span>
</td>
</tr>
<tr>
<td colspan="3">
<record v-model="value" />
</td>
<td>
<button class="btn btn-primary" @click.prevent="openChartEditor(0)">
<span class="glyphicon glyphicon-pencil"></span> Create Note
</button>
</td>
</tr>
</tbody>
</table>
</span>
</template>
<script>
module.exports = {
props: ["value"],
data: function() {
return {
sendFaxWorking: false
};
},
computed: {
completed_notes: function() {
return this.value.notes.filter(function(note) {
return note.signed_at;
}).length;
}
},
methods: {
audioURL: function(id) {
return "/notes/getAudio/" + id;
},
openChartEditor: function(id) {
this.$root.$emit("showEditor", id);
}
}
};
</script>
<style>
audio {
vertical-align: middle;
border: 0;
margin: 0;
}
</style>
答案 0 :(得分:0)
我认为这不是一个很好的答案,但确实可以。我添加了一个监视程序函数,该函数调用$forceUpdate()
mounted: function() {
this.$watch("value.notes", this.$forceUpdate);
},