我正在尝试使用Laravel Spark在自定义组件中加载Tutor的配置文件。无论我输入什么都没有问题,它会更新,但加载时总是为空。
组件本身如下:
Vue.component('tutor-settings', {
data() {
return {
tutor: [],
updateTutorProfileForm: new SparkForm({
profile: ''
})
};
},
created() {
this.getTutor();
Bus.$on('updateTutor', function () {
this.updateTutorProfileForm.profile = this.tutor.profile;
});
},
mounted() {
this.updateTutorProfileForm.profile = this.tutor.profile;
},
methods: {
getTutor() {
this.$http.get('/tutor/current')
.then(response => {
Bus.$emit('updateTutor');
this.tutor = response.data;
});
},
updateTutorProfile() {
Spark.put('/tutor/update/profile', this.updateTutorProfileForm)
.then(() => {
// show sweet alert
swal({
type: 'success',
title: 'Success!',
text: 'Your tutor profile has been updated!',
timer: 2500,
showConfirmButton: false
});
});
},
}
});
这是我的内联模板:
<tutor-settings inline-template>
<div class="panel panel-default">
<div class="panel-heading">Tutor Profile</div>
<form class="form-horizontal" role="form">
<div class="panel-body">
<div class="form-group" :class="{'has-error': updateTutorProfileForm.errors.has('profile')}">
<div class="col-md-12">
<textarea class="form-control" rows="7" v-model="updateTutorProfileForm.profile" style="font-family: monospace;"></textarea>
<span class="help-block" v-show="updateTutorProfileForm.errors.has('profile')">
@{{ updateTutorProfileForm.errors.get('profile') }}
</span>
</div>
</div>
</div>
<div class="panel-footer">
<!-- Update Button -->
<button type="submit" class="btn btn-primary"
@click.prevent="updateTutorProfile"
:disabled="updateTutorProfileForm.busy">
Update
</button>
</div>
</form>
</div>
对Vue来说很新,并试着在旅途中学习!非常感谢任何帮助!
答案 0 :(得分:0)
好的,首先应该使用bus
进行组件之间的通信,而不是组件本身之间的通信,因此updateTutor
应该是一种方法:
methods: {
getTutor() {
this.$http.get('/tutor/current')
.then(response => {
this.tutor = response.data;
this.updateTutor();
});
},
updateTutor() {
this.updateTutorProfileForm.profile = this.tutor.profile;
}
}
现在还要注意其他一些事项:
确保按照您希望执行的顺序调用代码,因为您似乎是emitting
到总线,然后设置this.tutor
,但您的函数使用this.tutor
的值} this.updateTutorProfileForm.profile
的更新,因此在尝试使用结果之前应该this.tutor = response.data;
。
您的$on
存在范围问题,因此this
并未引用Vue instance
数据,而是功能本身:
Bus.$on('updateTutor', function () {
// Here 'this' refers to the function itself not the Vue instance;
this.updateTutorProfileForm.profile = this.tutor.profile;
});
改为使用箭头功能:
Bus.$on('updateTutor', () => {
// Here 'this' refers to Vue instance;
this.updateTutorProfileForm.profile = this.tutor.profile;
});
确保您使用Vue
中CDN
的缩小版 进行开发,否则您将无法在console
中收到警告。
我无法看到您如何定义总线,但它应该只是全局范围内的空Vue实例:
var Bus = new Vue();
最后,您的mounted()
挂钩正在重复created()
挂钩代码,因此不需要它。我的猜测是你只是尝试了一些事情来触发更新,但你通常可以在created()
钩子中进行任何初始化数据,并在需要访问时使用mounted
钩子到this.$el
。见https://vuejs.org/v2/api/#Options-Lifecycle-Hooks