Я разрабатываю приложение Cordova (с MobileFirst Foundation 8.0), которое использует JSONStore, а также AngularJS.Не удалось заменить документ в коллекции JSONStore
Следующая функция обновляет документ, который уже хранится в локальной повестке дня собрания.
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();
}
Шаги:
найти документ внутри локальной коллекции с помощью идентификатора элемента - ЭТО РАБОТАЕТ
изменение содержания документа путем замены объекта, содержащегося в свойстве «JSon» : идентификатор не меняется, я его проверил - IT WORKS
заменить документ внутри коллекции - IT FAILS
возвращается ошибка не является стандартной перехватывать ошибку, сбой обработчика, это следующее:
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 ....
Эта ошибка обычно означает, что вы вызываете функцию снова и снова и нажимаете на крышку памяти браузера. Как вы используете эту функцию? Есть несколько хороших статей stackoverflow, где говорится об этой проблеме, возникающей при рекурсии, при подключении обработчика onClick к множеству событий и нескольких других экземпляров. Ваш фактический код обновления выглядит правильно, поэтому я думаю, что нам нужно больше узнать о вашем коде. – MBillau
@ enrico.visentini Я попробовал тот же сценарий с образцом магазина json здесь https://mobilefirstplatform.ibmcloud.com/tutorials/en/foundation/8.0/application-development/jsonstore/cordova/, и он отлично работает без каких-либо ошибок , –
Я попытался изменить только одно свойство элемента «json» документа, и он работает. Это означает, что я не могу заменить весь объект json обновленным ('results [0] .json = element;'), потому что он вызывает эту ошибку. Но почему? –