我有一个父/子组件设置,其中父级从服务器加载数据并通过道具将其传递给子级。在孩子中,我想用它从父母那里收到的一些数据来实例化一个 jQuery 日历。
为了在设置日历之前等待数据,我在父级中广播了一个事件,我在子级中设置了事件侦听器。
侦听器正在孩子中被解雇,但如果 I this.$log('theProp')
,它是未定义的。但是,如果我使用 VueJs devtools 检查组件,就会发现父/子关系存在并且子级同时收到了道具。
该道具在孩子上定义为动态道具:the-prop="theProp"
。由于孩子最终确实收到了道具,我假设我的设置是正确的,但似乎有某种延迟。父级在 ajax 调用的返回函数中设置道具,并再次:它正在工作,只是看起来有一点延迟。
我还尝试watch
在孩子的道具上注册一个监听器,这样我就可以设置日历并确保道具在那里。但是,监视侦听器会触发,但this.$log('theProp')
仍未定义。
如果我将数据与广播调用一起传递,就像this.$broadcast('dataLoaded', theData)
孩子收到它一样。但是这样做似乎是错误的,因为我基本上是在构建自己的道具处理程序。
我没有发布任何代码,因为组件相当大,并且 VueJs devtools 告诉我父/子情况正在工作。
我错过了一些信息吗?在父母中设置一个值和接收它的孩子之间是否有轻微的延迟?在孩子中等待父母数据的正确方法是什么?
通常,当您只是将数据渲染到模板中时,时间并不重要,因为数据已绑定到模板。但在这种情况下,我真的需要数据来设置日历,否则会出错。
谢谢。
编辑1:这是一个jsfiddle:https ://jsfiddle.net/dr3djo0u/1/
似乎确认广播后数据不可用。然而,观察者确实可以工作,尽管我几乎可以发誓,当我设置那个测试用例时,它有时会this.$log('someData')
返回。undefined
但我想我的问题可能出在其他地方,我今晚去看看,我现在没有这个项目。
编辑2:做了更多的测试。我的问题是a)事件侦听器似乎没有立即接收数据,b)如果已经存在(例如,当来自父级时),我也试图在route.data
回调中初始化日历,但是在someData
组件已准备就绪,因此它也无法在那里工作。
我的解决方案现在是这样的:
// works when the child route is loaded directly and parent finishes loading someData
watch: {
someData() {
this.initCalendar();
}
},
// works when navigating from parent (data already loaded)
ready() {
if (this.someData && this.someData.length) {
this.initCalendar()
}
}