2010-07-04 18 views
5

मैं एक ऐसा फ़ंक्शन बनाना चाहता हूं जो मेरे स्थानीय स्टोरेज ऑब्जेक्ट में कोई आइटम जोड़ता हो। उदा .:जावास्क्रिप्ट में एक फ़ंक्शन चेनिंग?

alert(localStorage.getItem('names').addItem('Bill').getItem('names')); 

पहली विधि GetItem जो localStorage वस्तुओं के लिए आइटम हो जाता है ... लेकिन addItem एक कस्टम समारोह होगा। अंततः कार्यों की यह श्रृंखला बिल को सतर्क करेगी।

तो, मैं इस फ़ंक्शन चेन को स्थानीय स्टोरेज में कैसे बनाऊंगा?

+0

यह कोई समझ नहीं आता है। 'इटिम' वापसी क्या होगी? – SLaks

+0

getItem श्रृंखला के अंत में होना चाहिए, लेकिन इसके अलावा इसे – galambalazs

+0

किया जा सकता है, यह सिर्फ 'सतर्क नहीं होना चाहिए (localStorage.getItem (' names ')। AddItem (' bill ')) '। –

उत्तर

5

यह संभव है अगर आप एक आवरण/डेकोरेटर वस्तु कि संभव चेनिंग बनाता पैदा करते हैं। उदाहरण के लिए jQuery कैसे काम करता है। लेकिन यह इस मामले में बेकार है

मैंने एक संभावित कार्यान्वयन किया, हालांकि।

लेकिन getItem श्रृंखला तोड़ देगा (इसलिए इसे हमेशा अंत में उपयोग किया जाना चाहिए)।

storage().setItem('names', 'Bill').getItem('names'); // or 
storage().setItem('names').addItem('Bill').getItem('names'); // or 
storage().key('names').value('Bill').set().get('names'); 

कार्यान्वयन

(function(window, undefined) { 

var storage = function(key, value) { 
    return new storage.init(key, value); 
}; 

storage.init = function(key, value) { 
    this._key = key; 
    this._value = value; 
}; 

storage.init.prototype = { 

    key: function(key) { 
    this._key = key; 
    return this; 
    }, 

    value: function(value) { 
    this._value = value; 
    return this; 
    }, 

    get: function(key) { 
    key = isset(key) || this._key; 
    return localStorage.getItem(key); 
    }, 

    set: function(key, value) { 
    this._key = key = isset(key) || this._key; 
    this._value = value = isset(value) || this._value; 
    if (key && value) { 
     localStorage.setItem(key, value); 
    } 
    return this; 
    }, 

    addItem: function(value) { 
    this._value = isset(value) || this._value; 
    if (this._key && value !== undefined) { 
     localStorage.setItem(this._key, value); 
    } 
    return this; 
    }, 

    // aliases... 
    getItem: function(key) { 
    return this.get(key); 
    }, 
    setItem: function(key, value ) { 
    return this.set(key, value); 
    } 
}; 

function isset(value) { 
    return value !== undefined ? value : false; 
} 

window.storage = storage; 

})(window); 
+0

बहुत बहुत धन्यवाद, मुझे कुछ खराब करना होगा। मैं आपके कोड को कॉपी और पेस्ट करता हूं और फिर अलर्ट (storage.setItem ('names') जोड़ता हूं। AddItem ('Bill')। GetItem ('names')); इसके ठीक नीचे और मुझे भंडारण मिल रहा है .setItem कोई फ़ंक्शन नहीं है? –

+0

@ ऑस्कर - आप कोष्ठक भूल गए: 'अलर्ट (स्टोरेज()। सेट इटिम (' नाम ')। AddItem (' bill ')। GetItem (' names ')) ' –

+0

@ ऑस्कर मार्सेल सही है, अब यह उदाहरण बनाता है भंडारण श्रृंखला, इसलिए आपको 'भंडारण() 'लिखना होगा। मैं इसे केवल एक वस्तु के रूप में संशोधित कर सकता हूं, लेकिन यह कम मजबूत हो सकता है। – galambalazs

5

यह असंभव है।

यदि getItem('names')Bill देता है, तो आप addItem पर कॉल नहीं कर सकते हैं।
भंडारण में प्रत्येक आइटम के लिए addItem और getItem विधियों को जोड़ना संभव होगा, लेकिन यह भयानक विचार होगा।

+0

jQuery अधिभार। –

+0

** यह संभव है ** (स्थानीय स्टोरेज को बढ़ाने के बिना)। मेरा जवाब देखें एक बहुत उपयोगी मामला नहीं है, लेकिन ** सजावट पैटर्न ** का एक अच्छा प्रदर्शन। – galambalazs

+1

@galambalazs: उसकी सटीक कॉल का उपयोग करना संभव नहीं है। – SLaks

0

सरल बात सब पर ऐसा नहीं करने के लिए :)

यदि वह काम नहीं करता है हो सकता है, फिर वहाँ देशी getItem को संशोधित करने की तरह समाधान कर रहे हैं समारोह लेकिन यह वास्तव में एक बुरा विचार है। सबसे अच्छा तरीका localStorage के आसपास एक रैपर लिखना होगा, जो कि jQuery को डोम नोड्स के साथ करता है, और उस रैपर का उपयोग स्थानीय संग्रहण में आइटम प्राप्त करने और रखने के लिए करता है। आवरण की तरह एक अंतरफलक हो सकता है:

ApplicationStorage 
    getItem() 
    setItem() 
    key() 
    removeItem() 

तब कि है की तरह addItem

ApplicationStorage.Array 
    addItem() 

जब applicationStorage.getItem("names") कहा जाता है तरीकों ApplicationStorage भीतर Array की तरह स्वीकार्य प्रकार रैपर को परिभाषित, ApplicationStorage.Array का एक उद्देश्य है कि विधि शामिल वापसी addItem जो चेनिंग संभव बना देगा।

0
getItem('names').addItem('Bill').getItem('names') 

मैं उलझन में हूं, आपको कोई आइटम कैसे जोड़ा गया है ???

GetItem एक वस्तु देता है एक नजर है निम्नलिखित ट्यूटोरियल addItem विधि शामिल है, और addItem विधि देता है एक वस्तु शामिल GetItem विधि

वैसे भी,। यह आपकी समस्या को पूरी तरह से हल नहीं करता है, लेकिन आपको एक विचार देगा।

http://guanfenglin.spaces.live.com/blog/cns!4E0822BF6C959B7F!668.entry

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