我正在使用Meteor + AngularJS框架。
我想根据离线集合中存储的数据(使用ground:db)来控制路由,但是在路由之前不能保证脱机数据就绪。
如果集合没有脱机,似乎有一些方法,比如" waitOn"或" subscriptionReady"值得研究,但离线收藏不需要订阅或出版物,我如何确保它们准备好,在路由之前或应用程序引导之前?
关键源片段:
1.route.js
import { LastLogin } from '../lib/collections';
angular.module('app')
.config(function ($stateProvider, $urlRouterProvider) {
console.log(LastLogin.find().count());
if(LastLogin.find().count() > 0){
$urlRouterProvider.otherwise('main/homepage');
}else{
$urlRouterProvider.otherwise('login');
}
});
2.collections.js
export const LastLogin = new Ground.Collection('lastLogin', {connection: null});
在大多数情况下,LastLogin.find()。count()为0,很少会是1,实际上在lastLogin集合中有几条记录可以在登录页面显示后正确打印出来,这将是对我来说太迟了。
我尝试通过Tracker.autorun
附上以下代码Tracker.autorun(function(){
if(LastLogin.find().count() > 0){
$urlRouterProvider.otherwise('main/home');
}else{
$urlRouterProvider.otherwise('login');
}
});
但没有帮助。
我的最终目的是让最后一个用户自动登录,即使在离线状态下也是如此。有更好的解决方案吗?
答案 0 :(得分:0)
最后我自己解决了这个问题。这个想法是理所当然的:db有一个“已加载”的事件,在此记录:https://github.com/GroundMeteor/db/blob/grounddb-caching-2016/EVENTS.md,我在几天前看过这个文档,但没有立即猜出用法。
来源(app.js):
// Startup
if (Meteor.isCordova) {
angular.element(document).on('deviceready', onReady);
}else {
angular.element(document).ready(onReady);
}
function onReady() {
Ground.on('loaded', function (ret) {
if(ret.collection == 'lastLogin'){
angular.bootstrap(document, ['app']);
}
});
}