从组件VM

时间:2016-04-08 20:22:56

标签: javascript vue.js vue-resource

这是一个非常简单的Vue应用程序,它将支持从主VM传递到组件。在我的实际应用程序中通过vue-resource获取该值。

https://jsbin.com/tazuyupigi/1/edit?html,output

当然可行,但我很难从组件VM本身访问这个值。

https://jsbin.com/hurulavoko/1/edit?html,output

如您所见,我的警报显示未定义。我怎样才能解决这个问题?似乎是执行顺序的问题,但使用compiled()created()代替ready()没有任何区别。

1 个答案:

答案 0 :(得分:2)

这是执行顺序的问题。主Vue实例在其内部的东西编译之前不会“准备好”。这包括hello组件。

如果您需要知道在使用bar之前已经设置了$broadcast,您可以通过几种方式进行监控。你可以bar父母的一个事件让孩子知道watch已被加载。或者您可以使用子组件中的bar函数在$set更新时进行更改。

如果您barcreated() vue-resource,您的示例确实有效,但greeting无论如何您都会有延迟,所以您需要考虑事实上ready()在孩子的greeting功能期间不会准备就绪。你要么必须设计你的DOM结构来处理undefined可能是watch的事实,要么你必须使用事件或$broadcast函数来自己等待它。

Vue.component('hello', { template: 'From hello tag: {{ greeting }}', props: ['greeting'], ready: function() { }, events:{ 'bar-ready':function(){ alert(this.greeting) } } }); new Vue({ el: '#app', created: function() { this.$http.get('/path') .then(function(response){ this.$set('bar',response.data); this.$broadcast('bar-ready') }.bind(this)) } }); 的示例:

$broadcast

\documentclass{article} \usepackage{pdfpages} \usepackage[paperwidth=8.5in, paperheight=11in]{geometry} \usepackage[multidot]{grffile} \pagestyle{plain} \begin{document} \setlength\voffset{+0.0in} \setlength\hoffset{+0.0in} \includepdf[ noautoscale=true , frame=false , pages={1} ] {<file.pdf>} \eject \paperwidth=17in \pdfpagewidth=17in \paperheight=11in \pdfpageheight=11in \includepdf[ nup=2x1 , noautoscale=true , frame=false , pages={2-,} ] {<file.pdf>} \end{document} 文档:https://vuejs.org/api/#vm-broadcast