由于我对WL6.2的更新,我在iOS(7.1.1)上遇到了JSONStore问题。我的应用程序中存在许多意外行为。我创建了一个测试应用程序来表明我的一些问题。只需创建一个新的WL项目并替换main.js文件并向index.html添加一些按钮。
的index.html:
<button id="destroyJSONStore">Destroy JSON Store</button>
<button id="search">Search</button>
<button id="load">Load</button>
main.js:
function wlCommonInit(){
document.getElementById("destroyJSONStore").onclick=function(){
WL.JSONStore.destroy()
.then(function() {
alert("JSON Store Destroyed");
});
};
document.getElementById("search").onclick=function(){
var query = {UserID: 1};
WL.JSONStore.get("Users").find(query)
.then(function(res) {
alert("Number of users found with ID 1: " + res.length);
})
.fail(function(errorObject) {
alert("Error loading user: " + userId + "\n" + errorObject.msg);
});
};
document.getElementById("load").onclick=function(){
var data = [{UserID: 1, Login: 'hvb'}];
var addOptions = {markDirty: true};
WL.JSONStore.get("Users").add(data, addOptions)
.then(function(added) {
alert("User successfully added; " + added);
})
.fail(function (errorObject) {
alert(errorObject.toString());
});
};
var collections = {
Persons : {
searchFields : {name: 'string', age: 'integer'}
}
};
var collections2 = {
Users : {
searchFields: { UserID: 'integer', Login: 'string'}
}
};
var options = {
username : 'jos',
password : 'jos',
localKeyGen : true
};
WL.JSONStore.init(collections, options)
.then(function () {
WL.Logger.debug("init persons ok");
})
.fail(function (errorObject) {
alert(errorObject.toString());
});
WL.JSONStore.init(collections2, options)
.then(function () {
WL.Logger.debug("init Users ok");
})
.fail(function (errorObject) {
alert(errorObject.toString());
});
}
第一次应用程序加载全部工作正常,如果单击加载,则会在商店中添加新文档,如果单击搜索,则会显示商店中的文档数。但是,当我开始玩应用程序时出错了。关闭并打开应用程序几次并添加新文档。过了一会儿,您会注意到搜索会不断返回相同数量的文档(无论您点击添加多少次)。
您还会注意到,一旦销毁了json存储并重新打开了应用程序,就会获得JSON_STORE_DATA_PROTECTION_KEY_FAILURE。您必须第二次重新启动应用程序才能删除它。
有人可以告诉我我做错了什么吗? 我承认在两次初始化JSONSstore可能看起来有点奇怪。但这是因为我们的应用程序是使用不同的模块构建的,并且关于配置,加载了不同的模块。根据文档,这不应该导致任何问题:
可以使用不同的集合初始化多次。初始化新集合时不会影响已初始化的集合。
顺便说一下:该应用程序在Android和移动浏览器模拟器上按预期工作。
答案 0 :(得分:2)
正如Daniel所建议的那样,问题是两种方法都在同时执行。这会导致奇怪的行为。解决方案是在第一个init完成后调用第二个init。这是一个如何做到这一点的例子。
WL.JSONStore.init(collections, options)
.then(function () {
WL.Logger.debug("init persons ok");
})
.then(function() {
WL.JSONStore.init(collections2, options)
.then(function () {
WL.Logger.debug("init Users ok");
})
.fail(function (errorObject) {
alert(errorObject.toString());
});
})
.fail(function (errorObject) {
alert(errorObject.toString());
});
答案 1 :(得分:1)
我想我知道问题是什么;你在destroy()调用之后显示一个警告,并认为看到警报意味着毁灭已经完成,但事实并非如此; destroy()也是一个异步API调用,所以像init一样,你必须使用promises / callback来做警报。例如:
WL.JSONStore.destroy()
.then(function(){
alert('Destroy is done!');
});