我想要一个加载模板,无论数据是否准备好,都要有最短的加载时间。所以基本上运行加载模板1秒,即使加载了模板和订阅?
下面是我的路由器代码。
Router.configure({
layoutTemplate: 'layout',
loadingTemplate: 'loading',
waitOn: function() { return Meteor.subscribe('contacts'); }
});
Router.map(function() {
this.route('acorn', {path: '/'});
});
Router.onBeforeAction('loading');
您可以通过包装对Meteor.subscribe
的调用并为订阅实例的ready
和stop
方法编写传递来实现这一点。您的ready
版本只有在一秒钟后并且包装好的订阅准备就绪后才会返回true。
您的waitOn
方法可能看起来像:
waitOn: function() {
var sub = Meteor.subscribe("contacts");
var dep = new Tracker.Dependency();
var isSubReady = false;
var hasWaitTimePassed = false;
Meteor.setTimeout(function() {
hasWaitTimePassed = true;
dep.changed();
}, 1000);
Tracker.autorun(function() {
isSubReady = sub.ready();
dep.changed();
});
return {
ready: function() {
dep.depend();
return hasWaitTimePassed && isSubReady;
},
stop: function() {
sub.stop();
}
};
}
当然,如果你想在很多地方使用它,你会想把所有的逻辑打包成一个可重用的函数,这样你就可以做一些事情,比如:
waitOn: function() {
return subscribeWithDelay("contacts", 1000);
}