2013-02-20 15 views
14

मैं निम्नलिखित मॉडल है:कैसे Knockoutjs toJS() से कुछ गुण को बाहर करने के

var model = { 
    A: 'One', 
    B: 'Two', 
    C: 'Three' 
}; 

मैं जो अच्छा काम करता है इन क्षेत्रों, करने के लिए विभिन्न UI तत्व बाँध। हालांकि, मैं JavaScript ऑब्जेक्ट को वापस मॉडल परिवर्तित तो मैं सर्वर में कोई परिवर्तन बचा सकते हैं:

var goingToServer = ko.toJS(model); 

goingToServer गुण ए, बी और सी में शामिल होंगे फिर भी, मान संपत्ति सी डेटा की एक बड़ी हिस्सा है चलो वह कभी नहीं बदलेगा। मैं इसे सर्वर पर वापस भेजने से बचना चाहता हूं।

वहाँ बनाने के लिए toJS()केवल क्षेत्रों में से एक पूर्वनिर्धारित सेट शामिल जब JavaScript ऑब्जेक्ट के लिए वापस एक मॉडल को परिवर्तित करने के लिए एक रास्ता है?

एक चीज जिसकी मैं जांच कर रहा हूं वह Knockout Mapping plugin है।

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

हालांकि, ऐसा लगता इस प्लगइन ['A', 'B'] के include सरणी में के रूप में ko.mapping.toJS() अभी भी ए, बी और सी में शामिल होंगे के रूप में दस्तावेज काम नहीं करता है, भले ही मैं पारित । मुझे लगता है कि इस सुविधा का उद्देश्य अतिरिक्त फ़ील्ड शामिल करना है जो मूल मॉडल में नहीं थे।

क्या मॉडल को किसी जावास्क्रिप्ट ऑब्जेक्ट में कनवर्ट करते समय कुछ गुणों को बाहर करने का कोई तरीका है, ऑब्जेक्ट उत्पन्न करने और सर्वर को भेजने से पहले मैं उन गुणों को मैन्युअल रूप से निकालने जैसे कुछ हैकी करने से कम?

उत्तर

23

क्या आपने ignore कीवर्ड की कोशिश की है? यह लिए एक समान उपयोग में शामिल किया गया है:

var mapping = { 
    'ignore': ["propertyToIgnore", "alsoIgnoreThis"] 
} 
var viewModel = ko.mapping.toJS(data, mapping); 

तुम बस की अनदेखी जब आप सर्वर डेटा के मूल मानचित्रण करते हैं, तो यह बिल्कुल अपने वस्तु पर नहीं होगा जब आप इसे वापस जे एस में बदलने का इस्तेमाल कर सकते हैं ।

+0

कि काम नहीं करता है, तो के रूप में आप इसे करने के लिए बिल्कुल भी बाध्य नहीं कर सकते हैं। –

+0

क्या आपने कोशिश की है? चूंकि प्रलेखन का उल्लेख नहीं है कि जेएस ऑब्जेक्ट्स पर वापस जाने पर अनदेखा किया जा सकता है या नहीं। –

+0

हाँ, मैंने अभी कोशिश की है। जब मैं 'नोट्स' फ़ील्ड को अनदेखा करता हूं और जब मैं लागू करता हूं बाइंडिंग्स, मुझे तुरंत अपवाद मिलता है कि मॉडल में 'नोट्स' फ़ील्ड नहीं मिला है। –

2

ठीक है, मैंने एक समाधान निकाला है जो काम करता है हालांकि मुझे उम्मीद है कि एक बेहतर दृष्टिकोण है। चाल मैपिंग प्लगइन में इन क्षेत्रों को अनदेखा करें, फिर उन्हें मैन्युअल रूप से गणना वाले फ़ील्ड के रूप में जोड़ें। toJS कहा जाता है जब गणना किए गए फ़ील्ड जेनरेट की गई जावास्क्रिप्ट ऑब्जेक्ट में कभी खत्म नहीं होंगे।

// Utility function to quickly generate a computed field 
ko.readonly = function (value) 
{ 
    return ko.computed(function() 
    { 
     return value; 
    }); 
}; 

// View Model 
var ViewModel = function (project) 
{ 
    var readonly = ['B', 'C', 'D']; // Fields I want to ignore 
    var mapping = { 
     'ignore': readonly //Read-only properties, we'll add these manually as computed fields 
    }; 

    // Use Mapping plugin to make everything observable, except the fields above 
    ko.mapping.fromJS(project, mapping, this); 

    // Now loop through the read only array and add these fields in as computed 
    for(var i = 0; i < readonly.length; i++) 
    { 
     var field = readonly[i]; 
     this[field] = ko.readonly(project[field]); 
    } 
} 

मैं अब सामान्य रूप में इन दृश्य मॉडल करने के लिए बाध्य कर सकते हैं:

ko.applyBindings(new ViewModel(data)); 
3

हम वी एम के तहत एक जटिल ऑब्जेक्ट मॉडल उदाहरण है।भुगतान नमूदार संदर्भ के रूप में:

{ 
 
    "Summary": { 
 
     "Count": 12, 
 
     "PaymentAmount": 1500, 
 
     "PaymentMethod": "Cheque", 
 
     "PaymentDate": "2015-04-08T22:38:48.552Z", 
 
     "AgentOid": 1208795, 
 
     "AgentName": "Asere Ware" 
 
    } 
 
    //[...] 
 
}

और तब ही कुछ भीतरी गुण अनदेखी करने के लिए, की जरूरत है:

var mapping = { 
 
    'ignore': ['Summary.PaymentMethod', 'Summary.PaymentDate'] //avoid lost some initialized values. 
 
}; 
 
// map updating existing observable (Payment) under my ViewMode (vm) with source "data" JSON object. 
 
ko.mapping.fromJS(data, mapping, vm.Payment);

और इस VM के लिए परिणाम है। भुगतान सामग्री, जहां केवल भुगतान विधि और भुगतान दिनांक रखे जाते हैं:

{ 
 
    "Summary": { 
 
     "Count": 0, 
 
     "PaymentAmount": 0, 
 
     "PaymentMethod": "Cheque", 
 
     "PaymentDate": "2015-04-08T22:38:48.552Z", 
 
     "AgentOid": undefined, 
 
     "AgentName": undefined 
 
    } 
 
    //[...] 
 
}

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