这是一个非常简单的Vue应用程序,它将支持从主VM传递到组件。在我的实际应用程序中通过vue-resource获取该值。
https://jsbin.com/tazuyupigi/1/edit?html,output
当然可行,但我很难从组件VM本身访问这个值。
https://jsbin.com/hurulavoko/1/edit?html,output
如您所见,我的警报显示未定义。我怎样才能解决这个问题?似乎是执行顺序的问题,但使用compiled()
或created()
代替ready()
没有任何区别。
答案 0 :(得分:2)
这是执行顺序的问题。主Vue实例在其内部的东西编译之前不会“准备好”。这包括hello
组件。
如果您需要知道在使用bar
之前已经设置了$broadcast
,您可以通过几种方式进行监控。你可以bar
父母的一个事件让孩子知道watch
已被加载。或者您可以使用子组件中的bar
函数在$set
更新时进行更改。
如果您bar
中created()
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