下面是单文件Vue.js模板。 note
对象作为道具传递给模板,并包含audio_length
和id
。
<template>
<span v-show="note.audio_length > 0" class="audio-element-wrapper">
<audio controls preload="none">
<source :src="audioURL" type="audio/webm">
Your browser does not support the audio element.
</audio>
<span>
({{note.audio_length}}s)
</span>
</span>
</template>
<script>
module.exports = {
mounted: function() {
console.log("mounted audioelement", this.note.id);
},
props: ['note'],
computed: {
audioURL: function() {
return "/notes/getAudio/" + this.note.id;
}
}
};
</script>
但是,当我加载组件时,计算出的audioURL
会导致/notes/getAudio/undefined
。显然,它在加载note
属性之前运行。花括号内的代码被正确解释。如何将src
属性绑定到正确计算的URL?
答案 0 :(得分:0)
如果您想将对象属性作为道具传递,那么您必须使用v-bind
指令,请参阅此处的docs。
我想在你的父组件中你有类似数据属性的东西:
data: function () {
return {
note: {
audio_lenght: 100,
id: 12
}
}
然后将您的组件编写为:
<your-component v-bind='note'></your-component>
在YourComponent.vue中:
...
props: ['id', 'audio_lenght']
...
computed: {
audioURL: function() {
return "/notes/getAudio/" + this.id;
}
}
将您的组件写为:
<your-component :note='note'></your-component>
在YourComponent.vue中:
props: {
note: {
type: Object
}
},
computed: {
audioURL: function() {
return "/notes/getAudio/" + this.note.id;
}
}
答案 1 :(得分:0)
我认为无法正常工作,因为 audioURL 计算值会返回没有文件格式的路径。
尝试更改您的计算:
computed: {
audioURL: function() {
return "/notes/getAudio/" + this.id + ".webm";
}
}
为了更好的调试,我建议你安装vue-devtools
答案 2 :(得分:0)
感谢大家的帮助。事实证明,问题并非与Vuejs 本身有关。这是一个浏览器问题。即使实际修改了src
元素,在您调用.load()
所以,有效的解决方案如下:
<template>
<span v-show="note.audio_length > 0" class="audio-element-wrapper">
<audio ref="player" controls preload="none">
<source :src="audioURL" type="audio/webm">
Your browser does not support the audio element.
</audio>
<span>
</template>
然后,在脚本中:
updated: function() {
this.audioURL = "/notes/getAudio/" + this.note.id;
this.$refs.player.load();
},