2011-02-23 13 views
10

मैं एक वेबप्ल के लिए स्टोरेज सिस्टम के रूप में एक स्क्लाइट डीबी का उपयोग कर रहा हूं। मैं उन वस्तुओं का उपयोग कर रहा हूं जो सीधे आवेदन में प्रश्नों से लौटाए जाते हैं। उदाहरण के लिए:अपरिवर्तनीय क्रोम स्क्लाइट रिटर्न ऑब्जेक्ट्स

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); 
    }); 
} 

यह मुझे दिए गए आईडी के साथ एक वस्तु देता है, सभी कॉलम गुणों के रूप में प्रदान किए जाते हैं। अच्छा लगा। जिस समस्या को मैंने अभी समझा है वह यह है कि परिणाम सेट ऑब्जेक्ट के सभी गुण अपरिवर्तनीय हैं। तो उदाहरण के लिए यदि मैं संपत्ति 'शीर्षक' को बदलना चाहता हूं तो इसका कोई प्रभाव नहीं पड़ता है, जो मेरी राय में कोई समझ नहीं आता है। उदाहरण:

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"; 

} 

मैं निश्चित रूप से मेरी सभी डीबी वस्तुओं को परिवर्तनीय वस्तुओं में परिवर्तित कर सकता हूं, लेकिन मैं ऐसा नहीं करता।

क्या यह एक अपेक्षित व्यवहार है? क्या मैं परिवर्तनीय वस्तुओं का अनुरोध कर सकता हूं?

मैं गूगल क्रोम 9.0 उपयोग कर रहा हूँ Mac OS X पर

+1

मैं एक समाधान के रूप यह कर रहा हूं: समारोह convert_to_mutable (result_object) { \t वर परिवर्तनशील = नई वस्तु(); \t (परिणाम_object में var कुंजी) {mutable [key] = result_object [key]}; \t वापसी \t उत्परिवर्तनीय; } –

+0

क्या आप दिखा सकते हैं कि आपने डेटाबेस कैसे बनाया है या इसके लिए प्रलेखन से लिंक किया है? – Havvy

+0

मैंने इसे यहां किया: https://github.com/whoisstan/hyper_books/blob/master/js/book_storage.js - प्रोजेक्ट्स लक्ष्य कॉपीराइट पुस्तकों के लिए एचटीएमएल 5 आधारित ईबुक रीडर लिखना था, मैंने खर्च नहीं किया है पिछले वर्षों में इसके साथ काफी समय, मुझे चाहिए। –

उत्तर

5

WebSQL spec की आवश्यकता नहीं करता लौटे आइटम के लिए बंद किया जाना है, लेकिन यह कार्यान्वयन पर निर्भर है (कल्पना करने के लिए आइटम के लिए आवश्यकता होती है अपनी क्वेरी में कॉलम के समान क्रम में गुणों के साथ एक आदेशित शब्दकोश हो)।

और नहीं, एक म्यूटेबल ऑब्जेक्ट का स्पष्ट रूप से अनुरोध करने का कोई तरीका नहीं है, इसलिए आप स्टैन द्वारा सुझाए गए convert_to_mutable() दृष्टिकोण जैसे कुछ करना चाहते हैं।

बीटीडब्ल्यू, मानते हुए कि आप किसी तृतीय पक्ष लाइब्रेरी का उपयोग कर रहे हैं, तो शायद इसके लिए एक फ़ंक्शन है, उदाहरण के लिए jQuery.extend() या _.extend()

+1

मैंने इसका उपयोग समाप्त कर दिया। क्या यह आश्चर्यजनक है कि मैं कम या ज्यादा कुशल हूं। newData = JSON.parse (JSON।स्ट्रिंग (परिणामडेटा)); –

0

स्टीफन के उत्तर पर बिल्डिंग, लेकिन मेरे जैसे लोगों के लिए जो SO से त्वरित समाधान चाहते हैं।
आप एक और मूल वस्तु बना सकते हैं और उस पर एसक्लाइट पंक्ति गुणों की प्रतिलिपि बना सकते हैं।
कुछ इस तरह:

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 ! 

मैं आईओएस सफारी में इस मुद्दे को भर में आया है, लेकिन Chrome और Android में वेब किट ब्राउज़र मैं वापस लौटा पंक्ति वस्तु के गुणों को अद्यतन करने में सक्षम था।

संबंधित मुद्दे