【发布时间】:2017-04-09 00:55:54
【问题描述】:
我正在开发一个使用 JSONStore 和 AngularJS 的 Cordova 应用程序(使用 MobileFirst Foundation 8.0)。
以下函数更新已存储在本地集合“议程”中的文档。
update : function(element){
var defer = $.Deferred();
// set query for get document stored in local collection
var query = {id: element.id};
// search for exact value
var options = {
exact: true,
limit: 1
};
var collection = WL.JSONStore.get('agenda');
// invoke search function
collection.find(query, options)//WL.JSONStore.get('agenda').find(query, options)
.then(function (results) {
// handle success - results (array of documents found)
var rowstatus = results[0].json.rowstatus || '';
// substitute current saved document with the update document
results[0].json = element;
// set value of rowstatus flag
results[0].json.rowstatus = rowstatus===''?'UPD':rowstatus;
var arrayMod = [];
arrayMod.push(results[0]);
//invoke replace procedure for update document in local collection
collection.replace(arrayMod, {markDirty: false })//WL.JSONStore.get('agenda').replace(item, {markDirty: false})
.then(function(docsRefreshed){
console.log("docsRefreshed", docsRefreshed);
defer.resolve();
})
.fail(function(refreshErr){
defer.reject(refreshErr);
});
})
.fail(function (findError) {
defer.reject(findError);
});
return defer.promise();
}
步骤如下:
通过元素的 id 在本地集合中查找文档 - 它可以工作
通过替换包含在“json”属性中的对象来更新文档的内容:id 没有改变,我验证了它 - 它可以工作
替换集合中的文档 - 失败
返回的错误不是fail handler拦截的标准错误,如下:
VM404 worklight.js:5139 Uncaught Exception: Uncaught RangeError: Maximum call stack size exceeded at (compiled_code):57__log @ VM404 worklight.js:5139PUBLIC_API.(anonymous function) @ VM404 worklight.js:5539WL.Logger.window。 onerror@VM404 worklight.js:5497 VM404 worklight.js:57 Uncaught RangeError: Maximum call stack size exceeded(...)it @ VM404 worklight.js:57__handleJsonObj @ VM416 jsonstore.js:1951__handleJsonObj @ VM416 jsonstore.js:1947__handleJsonObj @ VM416 jsonstore.js:1947__handleJsonObj @ VM416 jsonstore. JS:1947__handleJsonObj @ VM416 jsonstore.js:1947__handleJsonObj @ VM416 jsonstore.js:1942__handleJsonObj @ VM416 jsonstore.js:1947__handleJsonObj @ VM416 jsonstore.js:1942__handleJsonObj @ VM416 jsonstore.js:1947__handleJsonObj @ VM416 jsonstore.js:1942__handleJsonObj @ VM416 jsonstore.js :1947__handleJsonObj @ VM416 jsonstore.js:1942__handleJsonObj @ VM416 jsonstore.js:1947__handleJsonObj @ VM416 jsonstore.js:1942__handleJsonObj @ VM416 jsonstore.js:1947__handleJsonObj @ VM416 jsonstore.js:1942__handleJsonObj @ VM416 jsonstore.js:1947__handleJsonObj @ VM416 jsonstore.js: 1942__handleJsonObj @ VM416 jsonstore.js:1947__handleJsonObj @ VM416 jsonstore.js:1942__handleJsonObj ....
【问题讨论】:
-
此错误通常意味着您一遍又一遍地调用函数并达到浏览器内存上限。你是如何使用这个功能的?当将 onClick 处理程序附加到很多事件和其他一些实例时,有一些很好的 stackoverflow 帖子讨论了递归出现的这个问题。您的实际更新代码看起来是正确的,所以我认为我们需要查看更多代码。
-
@enrico.visentini 我在mobilefirstplatform.ibmcloud.com/tutorials/en/foundation/8.0/… 的 json 存储示例中尝试了相同的场景,它工作正常,没有任何错误。
-
我尝试只修改文档的“json”元素的一个属性,它可以工作。这意味着我无法用更新的对象 (
results[0].json = element;) 替换整个 'json' 对象,因为它会导致此错误。但为什么呢? -
我解决了这个问题。该错误是由使用的插件自动添加的属性引起的,该属性导致 json 对象的循环引用。删除这个属性我可以替换所有的 'json' 对象。
-
太好了,很高兴它有效。干杯
标签: javascript cordova ibm-mobilefirst jsonstore