Meteor-React:GroundDB 突然空了
Meteor-React: GroundDB suddenly empty
[编辑] 更新为 Ground DB v2,使代码更具可读性
我正在尝试在我的项目中使用 GroundDB,因此我的 Meteor-React Cordova 应用程序也可以 运行 离线。在主容器中,我有以下代码:
let fullyLoaded = new ReactiveVar(false);
let subscribed = false;
let subscribedOnce = false;
let checking = false;
export default createContainer(() => {
if(Meteor.status().connected && !subscribedOnce && !subscribed){
subscribed = true;
console.log("subscribing");
Meteor.subscribe("localization",
()=> {
localizationGrounded.keep(Localization.findNonGrounded());
console.log("everything has been loaded once.");
console.log("Localization count after subscription: " + Localization.find().fetch().length);
fullyLoaded.set(true);
subscribed = false;
subscribedOnce = true;
}
);
}
if(fullyLoaded.get()){
console.log("Localization Count: " + Localization.find().fetch().length)
}
return {
isLoggedIn: !!Meteor.userId(),
isLoading: !fullyLoaded.get() || subscribed,
};
}, Main);
如果尚未加载,此代码应该订阅 "localization"。 Localization Collection 实现如下,find() 和 findOne() 方法已被重写为为 grounded DB 调用 find():
export const Localization = new Mongo.Collection('localization');
if(Meteor.isClient){
export let localizationGrounded = new Ground.Collection('localization', {
cleanupLocalData: false
});
//rename find() to findNonGrounded
Localization.findNonGrounded = Localization.find;
localizationGrounded.observeSource(Localization.findNonGrounded());
Localization.find = function(...args){
console.log("finding from ground db");
return localizationGrounded.find(...args);
};
Localization.findOne = function(...args){
console.log("finding one from ground db");
return localizationGrounded.findOne(...args);
}
}
然而,这会产生以下输出:
subscribing
everything has been loaded once
finding from ground db
Localization count after subscription: 28
finding from ground db
Localization count: 28
看起来不错吧?不幸的是,之后立即再次调用 createContainer() 函数,导致
...
Localization count: 28
//Lots of "finding one from ground db" indicating the page is being localized correctly
finding from ground db
Localization Count: 0
//more "finding one from ground db", this time returning undefined
请帮我解决这个问题。
提前致谢
紫杉
据我们调查(同时发现您的问题),这不是 GroundDB 错误。
目前我们正在做类似的事情:也是一个 Cordova 应用程序,试图使大约 30 个不同的集合保持离线状态,并且也使用 React(但使用 Mantrajs)。所以就像今天一样,我们几乎可以肯定这是 Meteor 从 Collections 中删除数据的方式,我将尝试解释一下:
似乎 Meteor 以某种方式检测到未使用 Collections 并几乎立即删除所有数据,然后 GroundDB 也从 IndexedDB 中删除数据。我们下载了 GroundDB 代码,将其添加到我们的 Meteor 项目并检查了它,发现了之前的行为。
目前,我们正在尝试找到一些方法来检测集合何时被完全删除,Meteor 集合上的某种 属性 可以告诉我们它将被清除,因此我们可以修复 GroundDB代码并且在这种情况下不要删除 IndexedDB 数据。
我们正在尝试的另一个选项是使用此组件:https://github.com/richsilv/meteor-dumb-collections
它看起来与 GroundDB 非常相似,但它永远不会将本地数据同步到 Meteor 服务器,直到您调用同步功能,所以它可能更难用于我们和我们的 30 个集合:)
希望对你有帮助。
[编辑] 更新为 Ground DB v2,使代码更具可读性
我正在尝试在我的项目中使用 GroundDB,因此我的 Meteor-React Cordova 应用程序也可以 运行 离线。在主容器中,我有以下代码:
let fullyLoaded = new ReactiveVar(false);
let subscribed = false;
let subscribedOnce = false;
let checking = false;
export default createContainer(() => {
if(Meteor.status().connected && !subscribedOnce && !subscribed){
subscribed = true;
console.log("subscribing");
Meteor.subscribe("localization",
()=> {
localizationGrounded.keep(Localization.findNonGrounded());
console.log("everything has been loaded once.");
console.log("Localization count after subscription: " + Localization.find().fetch().length);
fullyLoaded.set(true);
subscribed = false;
subscribedOnce = true;
}
);
}
if(fullyLoaded.get()){
console.log("Localization Count: " + Localization.find().fetch().length)
}
return {
isLoggedIn: !!Meteor.userId(),
isLoading: !fullyLoaded.get() || subscribed,
};
}, Main);
如果尚未加载,此代码应该订阅 "localization"。 Localization Collection 实现如下,find() 和 findOne() 方法已被重写为为 grounded DB 调用 find():
export const Localization = new Mongo.Collection('localization');
if(Meteor.isClient){
export let localizationGrounded = new Ground.Collection('localization', {
cleanupLocalData: false
});
//rename find() to findNonGrounded
Localization.findNonGrounded = Localization.find;
localizationGrounded.observeSource(Localization.findNonGrounded());
Localization.find = function(...args){
console.log("finding from ground db");
return localizationGrounded.find(...args);
};
Localization.findOne = function(...args){
console.log("finding one from ground db");
return localizationGrounded.findOne(...args);
}
}
然而,这会产生以下输出:
subscribing
everything has been loaded once
finding from ground db
Localization count after subscription: 28
finding from ground db
Localization count: 28
看起来不错吧?不幸的是,之后立即再次调用 createContainer() 函数,导致
...
Localization count: 28
//Lots of "finding one from ground db" indicating the page is being localized correctly
finding from ground db
Localization Count: 0
//more "finding one from ground db", this time returning undefined
请帮我解决这个问题。 提前致谢
紫杉
据我们调查(同时发现您的问题),这不是 GroundDB 错误。
目前我们正在做类似的事情:也是一个 Cordova 应用程序,试图使大约 30 个不同的集合保持离线状态,并且也使用 React(但使用 Mantrajs)。所以就像今天一样,我们几乎可以肯定这是 Meteor 从 Collections 中删除数据的方式,我将尝试解释一下:
似乎 Meteor 以某种方式检测到未使用 Collections 并几乎立即删除所有数据,然后 GroundDB 也从 IndexedDB 中删除数据。我们下载了 GroundDB 代码,将其添加到我们的 Meteor 项目并检查了它,发现了之前的行为。
目前,我们正在尝试找到一些方法来检测集合何时被完全删除,Meteor 集合上的某种 属性 可以告诉我们它将被清除,因此我们可以修复 GroundDB代码并且在这种情况下不要删除 IndexedDB 数据。
我们正在尝试的另一个选项是使用此组件:https://github.com/richsilv/meteor-dumb-collections
它看起来与 GroundDB 非常相似,但它永远不会将本地数据同步到 Meteor 服务器,直到您调用同步功能,所以它可能更难用于我们和我们的 30 个集合:)
希望对你有帮助。