环境:Windows上的Worklight Studio 6.1。我想确认我们对使用JSONStore.init()方法的理解。这是从this question开始的,它确定在调用init()重新打开商店时,我们必须传递与第一次初始化商店时完全相同的参数。
现在的问题是当我们应该调用init(),以及我们是否会因意外多次调用init()而导致任何问题。这似乎是显而易见的,但我们正在尝试诊断一些错误情况,一个可能的原因是我们可能经常调用init()。
我的期望是,在使用JSONstore集合的应用程序的任何给定执行中必须为每个集合调用init()(可能通过使用集合列表调用init())并且合理的模型是在应用程序启动时这样做。这是基于我阅读文档JSONstore.init。
我们可以确认从那时起我们可以:
A)。
自由地使用JSONStore.get()之类的方法,而不需要进一步的init()调用。B)。如果我们再次为已初始化的集合调用init(),则应该没有副作用。
我们似乎遇到的症状是,有时第二次调用init()会导致错误消息
PROVISION_TABLE_SEARCH_FIELDS_MISMATCH in worklight.js at line 4556
虽然我们可以看到我们总是使用缩进的集合参数调用init()。
答案 0 :(得分:4)
如果您是第一次打开集合,或者在关闭商店后重新打开集合,则只需要调用init。如果您已完成使用JSONStore并希望为安全目的关闭它,或者如果您要使用多个用户时想要切换到另一个JSONStore用户,则只需要关闭存储。如果您不需要这两种情况,则无需关闭商店。
您绝对可以在启动时初始化集合,并在应用程序生命周期的剩余时间内打开它们,然后在应用程序关闭时关闭它,例如。调用get或任何其他JSONStore方法时,不必调用init;你只需要调用init,就像我说的那样,当你第一次使用该集合时,或者在你关闭或销毁商店之后(通过调用WL.JSONStore.closeAll()或WL.JSONStore.destroy())。
至于你得到的错误,很可能意味着你第二次调用init时传递不同的字段,而你不能这样做,因为搜索字段不能动态更改。如果要更改搜索字段,首先必须删除该集合(并丢失其中的数据),然后使用新数据重新初始化它。
要验证您可以多次调用init(使用相同的参数),可以运行以下示例代码:
var collections = {
people : {
searchFields : {name: 'string'}
},
orders : {
searchFields: {name: 'string'}
}
};
WL.JSONStore.init(collections)
.then(function () {
return WL.JSONStore.init(collections);
})
.then(function () {
return WL.JSONStore.init(collections);
})
.then(function () {
//init called 3 times succesfully
alert('Multiple inits worked');
})
.fail(function (err) {
//this should not be called
alert('Multiple inits failed' + err.toString());
});