【问题标题】:Failing to replace a document inside a JSONStore collection无法替换 JSONStore 集合中的文档
【发布时间】: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();

}

步骤如下:

  1. 通过元素的 id 在本地集合中查找文档 - 它可以工作

  2. 通过替换包含在“json”属性中的对象来更新文档的内容:id 没有改变,我验证了它 - 它可以工作

  3. 替换集合中的文档 - 失败

返回的错误不是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


【解决方案1】:

来自@encrico.visentini 的 cmets:

我解决了这个问题。该错误是由使用的插件自动添加的属性引起的,该属性导致 json 对象的循环引用。删除这个属性我可以替换所有的 'json' 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 2014-05-20
    • 2014-09-27
    • 2016-10-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多