2012-09-17 10 views
15

का उपयोग करते समय गुण है कि रिक्त हैं अनदेखी करने के लिए?नॉकआउट क्रमबद्धता कैसे

मेरे वर्तमान ViewModel Serializing JSON के 500 केबी के आसपास पैदा करता है जिनमें से अधिकांश की तरह समाप्त होता है:

"SomeObject": { 
    "Property1": 12345, 
    "Property2": "Sometext", 
    "Property9": false 
} 
:

"SomeObject": { 
    "Property1": 12345, 
    "Property2": "Sometext", 
    "Property3": null, 
    "Property4": null, 
    "Property5": null, 
    "Property6": null, 
    "Property7": null, 
    "Property8": null, 
    "Property9": false 
} 

मैं serializer शून्य मान तो यह करने के लिए नीचे कम किया जा सकता अनदेखी करने के लिए मिल सकता है, तो

कोई विचार है कि मैं धारावाहिक को शून्य मूल्यों को अनदेखा करने के लिए कैसे निर्देश दे सकता हूं ??

+3

कुछ ध्यान देने के लिए, ko.toJSON ** ** अनिर्धारित मानों को अनदेखा करता है, उदाहरणों के लिए बेवकूफ देखें। http://jsfiddle.net/Rynan/EnVmu/ – Rynan

+0

@Rynan - यह एक उपयोगी अवलोकन है। मुझे इतना एहसास नहीं हुआ कि धन्यवाद। –

उत्तर

26

याद रखें कि ko.toJSON केवल JSON stringify का एक संशोधन है। आप replacer function में पास कर सकते हैं।

नॉकआउट में एक प्रतिकृति फ़ंक्शन का उपयोग करने के उदाहरण के रूप में, मैंने में से एक पर JSFiddle को एक साथ रखा। makeJson और makeCleanJson फ़ंक्शंस के बीच अंतर पर ध्यान दें। हम अपने replacer फ़ंक्शन में किसी भी मान को वापस नहीं करना चुन सकते हैं और आइटम JSON स्ट्रिंग में छोड़ा जाएगा।

self.makeJson = function() { 
    self.JsonInfo(ko.toJSON(self.availableMeals)); 
}; 

self.makeCleanJson = function() { 
    self.JsonInfo(ko.toJSON(self.availableMeals, function(key, value) { 
     if (value == null) 
     { 
      return; 
     } 
     else 
     { 
      return value; 
     } 
    })); 
}; 
+1

ग्रेट उत्तर, डेलट्री। और jsFiddle के लिए धन्यवाद। मेरे द्वारा किए गए एकमात्र परिवर्तन को 'value === null' के बजाय 'value === null' का उपयोग करना था ताकि अतिरिक्त सुनिश्चित हो सके! –

+0

@MarkRobinson खुश है कि मैं – deltree

+0

इस उत्तर के लिए धन्यवाद कर सकता हूं, जल्द ही इसे आज़माउंगा ... बस आपको यह बताने के लिए चाहता था कि jsFiddle में refo को मृत किया गया है। इसके बजाए इसका इस्तेमाल किया गया - http://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js –

14

आप अपने दृश्य मॉडल के लिए एक toJSON विधि जोड़कर उसे उपयोग करने वाले सभी अनावश्यक गुण दूर करने के लिए कर सकते हैं:

ViewModel.prototype.toJSON = function() { 
    var copy = ko.toJS(this); 
    // remove any unneeded properties 
    if (copy.unneedProperty == null) { 
     delete copy.unneedProperty; 
    } 
    return copy; 
} 

आप शायद अपने सभी गुण के माध्यम से अशक्त लोगों को चलाने के लिए और नष्ट करने के लिए यह स्वचालित कर सकता है ।

+0

उत्तर मैट के लिए धन्यवाद लेकिन मुझे लगता है कि यह अधिक काम करता है अगर संपत्ति को मेरे मामले के बजाय JSON में कभी भी परिवर्तित नहीं किया जाना चाहिए, जहां मैं केवल संपत्ति को जेएसओएन में परिवर्तित करना चाहता हूं, जब उसका मान शून्य नहीं है। –

+2

@ मार्कबॉबिन्सन: ऐसा नहीं, आप जांचते हैं कि यह शून्य है, और अगर यह है तो इसे हटा दें। यह स्पष्ट करने के लिए मैं अपना जवाब संपादित करूंगा। –

+1

स्पष्टीकरण के लिए धन्यवाद, मैट। संशोधित दृष्टिकोण काम करेगा। आपके दृष्टिकोण का लाभ यह लगता है कि यह अधिक बढ़िया अनाज नियंत्रण प्रदान करता है जिस पर संपत्तियों के उनके शून्य मूल्यों को अनदेखा किया जाता है लेकिन @ डेलट्री उत्तर कोड की केवल दो पंक्तियों के साथ विश्व स्तर पर काम करता है जो मेरी स्थिति को बेहतर बनाता है। एक उपयोगी दृष्टिकोण के लिए वैसे भी +1। –