Неизменяемые объекты возврата chrome sqlite
Я использую sqlite DB в качестве системы хранения для webapp. Я использовал объекты, возвращаемые из запросов непосредственно в приложении. Например:
function get_book_by_id(id,successCallback,errorCallback)
{
function _successCallback(transaction, results)
{
if(results.rows.length==0) {successCallback(null);}
else
{
book=results.rows.item(0);
successCallback(book);
}
}
db.transaction(
function (transaction) {
transaction.executeSql("SELECT id,title,content,last_read from books where id=?;",[id], _successCallback, errorCallback);
});
}
Это возвращает мне объект с данным идентификатором, все столбцы предоставляются как свойства. Ницца. Проблема, которую я только что выяснил, заключается в том, что все свойства объекта набора результатов неизменяемы. Так, например, если я хочу изменить свойство "title", это не имеет никакого эффекта, что, на мой взгляд, не имеет смысла. Пример:
get_book_by_id(1,handle,error);
function handle(book)
{
//THIS DOESN'T WORK, book.title is still what it was.
book.title=book.title+"more text";
}
Я, конечно, могу преобразовать все мои объекты БД в изменяемые объекты, но я бы этого не сделал.
Это ожидаемое поведение? Могу ли я запросить изменяемые объекты?
Я использую google chrome 9.0 в Mac OS X.
Ответы
Ответ 1
Спецификация WebSQL не требует для возвращаемого элемента, который должен быть запечатан, но это до реализации (спецификация требует, чтобы элемент был упорядоченным словарем со свойствами в том же порядке, что и столбцы в вашем запросе).
И нет, нет способа явно запросить изменяемый объект, поэтому вы захотите сделать что-то вроде подхода convert_to_mutable()
, предложенного Стэном.
Кстати, если вы используете стороннюю библиотеку, у нее, вероятно, есть функция для этого, например jQuery.extend() или _. extend().
Ответ 2
Основываясь на ответах Степана, но для таких людей, как я, которые хотят быстро исправить из SO.
Вы можете создать другой базовый объект и скопировать свойства строки sqlite на него.
Что-то вроде этого:
var immutable_book = results.rows.item(0);
var book = {};
for (var prop in immutable_book) {
if (immutable_book.hasOwnProperty(prop)) {
book[prop] = immutable_book[prop];
}
}
Это происходит в _successCallback, а затем вы можете сделать это:
book.title=book.title+"more text"; // works now !
Я столкнулся с этой проблемой в iOS Safari, но в браузерах браузера Chrome и Android мне удалось сразу обновить свойства возвращаемого объекта строки.