Meteor Vue Tracker无法监听Subready,计算属性及订阅依赖问题求助
解决Vue-Meteor-Tracker中计算属性不响应$subReady变化的问题
我之前在迁移Blaze项目到Vue+Meteor 1.6.1时也踩过这个坑,核心问题在于**$subReady并不是Vue的响应式对象**——Vue的计算属性只能追踪自身响应式数据(比如data、props、其他computed)的变化,直接访问$subReady的话,Vue无法感知到它的状态更新,自然不会重新计算你的subscriptionReady属性。
下面给你两个可行的解决方案:
方案一:用Tracker Autorun包装订阅状态
利用Meteor的Tracker.autorun来监听$subReady.users的变化,把状态同步到Vue的响应式数据中,这样计算属性就能正常响应了:
export default { data() { return { filter: null, // 定义一个响应式变量来存储订阅就绪状态 isUsersSubReady: false } }, created() { // 用Tracker自动追踪$subReady的变化 this.trackerAutorun(() => { this.isUsersSubReady = this.$subReady.users }) }, computed: { subscriptionReady() { // 现在依赖的是响应式的isUsersSubReady,状态变化时会自动更新 return this.isUsersSubReady } }, meteor: { $subscribe: { // 先订阅users users: [], // 这里填users订阅需要的参数,如果没有就空数组 // 依赖users订阅的第二个订阅,只有当users就绪后才执行 dependentSubscription() { // 这里的this.$subReady变化会被Tracker追踪,就绪后自动触发订阅 if (this.$subReady.users) { return [this.filter] // 填第二个订阅的参数 } } } } }
方案二:直接在$subscribe中处理依赖(更简洁)
其实vue-meteor-tracker的$subscribe支持函数式的参数,这些函数会被Tracker自动追踪依赖。你可以直接在第二个订阅的参数函数里判断$subReady.users的状态,这样不需要额外的计算属性就能实现“等待第一个订阅就绪再执行第二个”的需求:
export default { data() { return { filter: null } }, meteor: { $subscribe: { users: [], // 主订阅users // 第二个订阅仅在users就绪后才会触发 dependentSubscription() { // 当$subReady.users从false变为true时,这个函数会重新执行,触发订阅 if (this.$subReady.users) { return [this.filter] } // 返回false或undefined的话,订阅会被取消 return false } } }, // 如果仍然需要一个计算属性来判断状态,就用方案一的响应式变量 computed: { subscriptionReady() { return this.isUsersSubReady } } }
为什么原来的写法不生效?
再强调下:$subReady是vue-meteor-tracker注入的一个普通对象,不是Vue的响应式数据。Vue的计算属性依赖收集机制只能识别Vue实例上的响应式属性,所以直接在计算属性里访问this.$subReady.users,Vue无法监听它的变化,只会在组件初始化时计算一次。
内容的提问来源于stack exchange,提问作者abhima9yu
相关产品推荐
相关产品推荐

