首先,我本身并没有使用Meteor,而是使用Angular-Meteor,所以原理是一样的。我需要做的是在资源有效或无效时在helper
函数中进行验证,并根据其结果做出决定。
我认为find
和findOne
集合的功能在客户端是同步的,但似乎它们不是,或者我是以错误的方式做事情。
我有以下代码:
this.helpers({
post() {
let _post = Posts.findOne({
_id: this.postId
});
if( typeof _post == 'undefined' )
return this.$state.go('404');
return _post;
}
});
this.postId
来自Url params。当我浏览应用程序时,所有工作。但是,当我刷新页面时,this.postId
已定义但Posts.find()
返回undefined
,显然,它会转到404页面。
¿我怎样才能解决这个问题呢?
答案 0 :(得分:1)
这是因为刷新页面时,会在将数据发送到客户端之前呈现视图。要解决此问题,您需要确保数据准备就绪,然后再检查它是否存在。换句话说,它意味着要检查您的订阅是否准备就绪,请将此代码用作演示:
const handle = Meteor.subscribe('data');
if (handle.ready()) {
const post = Posts.findOne(/**/);
if (typeof post === 'undefined') {
console.log('post does not exist');
}
}
答案 1 :(得分:0)
@Khang在数据就绪之前呈现的视图是正确的。
另一种方法是使用this.getReactively()
这就是你的助手的样子:
this.helpers({
post() {
let _post = Posts.findOne({
_id: this.getReactively('postId')
});
if( typeof _post == 'undefined' )
return this.$state.go('404');
return _post;
}
});
帮助程序将首次运行并且不返回任何内容(即在数据准备好之前),因此您的代码应该将其作为正常情况处理(不要执行$state.go('404')
)
请记住在构造函数中声明this.postId
,否则getReactively()
无法正常工作。