मैं एक वेबपेज पर कार्यक्षमता का निर्माण कर रहा हूं जिसे उपयोगकर्ता कई बार कर सकता है। उपयोगकर्ता की कार्रवाई के माध्यम से, एक वस्तु / मॉडल बनाया जाता है और ko.applyBindings () का उपयोग करके HTML पर लागू किया जाता है।
डेटा-बाउंड HTML को jQuery टेम्प्लेट के माध्यम से बनाया गया है।
अब तक सब ठीक है।
जब मैं दूसरी वस्तु / मॉडल बनाकर इस कदम को दोहराता हूं और ko.applyBindings () मैं दो समस्याओं का सामना करता हूं:
- मार्कअप पिछली वस्तु / मॉडल के साथ-साथ नई वस्तु / मॉडल को दर्शाता है।
- एक जावास्क्रिप्ट त्रुटि ऑब्जेक्ट / मॉडल में किसी एक गुण से संबंधित होती है, हालांकि यह अभी भी मार्कअप में प्रदान की जाती है।
इस समस्या को हल करने के लिए, पहले पास के बाद मैं jQuery के .empty () को अस्थायी HTML को हटाने के लिए कहता हूं जिसमें सभी डेटा-बाइंड विशेषताएँ शामिल हैं, ताकि यह DOM में अब न हो। जब उपयोगकर्ता दूसरी पास के लिए प्रक्रिया शुरू करता है तो डेटा-बाउंड HTML को DOM में दोबारा जोड़ा जाता है।
लेकिन जैसा मैंने कहा, जब HTML को DOM में दोबारा जोड़ा जाता है और नए ऑब्जेक्ट / मॉडल में फिर से बाउंड किया जाता है, तब भी इसमें पहले ऑब्जेक्ट / मॉडल का डेटा शामिल होता है, और मुझे अभी भी JS त्रुटि मिलती है जो नहीं होती है पहली पास के दौरान।
निष्कर्ष यह प्रतीत होता है कि नॉकआउट इन बाध्य गुणों को पकड़ रहा है, भले ही मार्क से डोम को हटा दिया गया हो।
तो मैं जो देख रहा हूं वह नॉकआउट से इन बाध्य गुणों को हटाने का एक साधन है; नॉकआउट के बारे में बताते हुए कि अब कोई देखने योग्य मॉडल नहीं है। क्या इसे करने का कोई तरीका है?
संपादित करें
मूल प्रक्रिया यह है कि उपयोगकर्ता एक फ़ाइल अपलोड करता है; सर्वर तब JSON ऑब्जेक्ट के साथ प्रतिक्रिया करता है, डेटा-बाउंड HTML को DOM में जोड़ा जाता है, फिर JSON ऑब्जेक्ट मॉडल इस HTML का उपयोग करने के लिए बाध्य होता है
mn.AccountCreationModel = new AccountViewModel(jsonData.Account);
ko.applyBindings(mn.AccountCreationModel);
उपयोगकर्ता द्वारा मॉडल पर कुछ चयन किए जाने के बाद, उसी ऑब्जेक्ट को सर्वर पर वापस पोस्ट किया जाता है, डेटा-बाउंड HTML को तब DOM से हटा दिया जाता है, और मेरे पास तब निम्न JS है
mn.AccountCreationModel = null;
जब उपयोगकर्ता इसे एक बार फिर से करना चाहता है, तो इन सभी चरणों को दोहराया जाता है।
मुझे डर है कि jsFiddle डेमो करने के लिए कोड बहुत 'शामिल' है।
initफ़ंक्शन को उजागर क्यों नहीं किया जाता है जिसमें आप डेटा को लागू करने के लिए पास करते हैं?