2012-02-10 8 views
6

मुझे वर्तमान में यूआई रीफ्रेश करने में समस्याएं आ रही हैं जब मुझे एक आइटम के लिए सर्वर से नया डेटा मिल रहा है जो एक अवलोकन में है रैपर ऑब्जेक्ट्स का ऐरे जिसमें कई अवलोकनों का ऑब्जेक्ट होता है ।ताजा डेटा ऑब्जेक्ट के साथ नॉकआउट यूआई अपडेट नहीं कर सकता

var vm = { 
.... 
localEdited: ko.mapping.fromJS(new ItemWrapper(defaultModelSerialised)), 
selected: ko.observable(null), 
editItem: function(data) { 
    // clone a temporary copy of data for the dialog when opening (*.localEdited on dialog) 
    var clonedData = ko.toJS(data); 
    ko.mapping.fromJS(clonedData, null, this.localEdited); 

    // selected should now point to the item in the obserable array which will be refreshed 
    this.selected(data); 

    // open dialog... 
}, 
submitDialog: function(data) { 

    // submit data to server... 

    // (1) commit the data back to UI (new item is return in resp.entity from server) 
    vm.selected(new ItemWrapper(resp.entity)); 

    // at this point the UI isn't showing the updated value 

    // (2) however if I do this it reflects the data change in the UI 
    this.selected().Name("changed"); // updates the UI. 
} 

कोई व्याख्या कर सकते हैं क्यों vm.selected जबकि में (2) यह काम करता है यूआई अद्यतन करने नहीं है में ItemWrapper में गुजर:

निम्नलिखित पर विचार करें। मैं प्रत्येक संपत्ति के लिए (2) में प्रत्येक संपत्ति को सेट अप नहीं करना चाहता हूं।

ItemWrapper तो दिखाई देता है:

function PoolWrapper(pool) { 
    this.Name = ko.observable(pool.Name); 

    // more properties... 
} 
+0

क्या आप एचटीएमएल में vm.selected के लिए कुछ भी बांधते हैं? यदि नहीं, तो आप इस लाइन में यूआई को अपडेट करने की उम्मीद क्यों करते हैं vm.selected (नया ItemWrapper (resp.entity)); ? –

+0

शायद आप जेएसफ़िल्ड में कुछ दिखाने के लिए कुछ प्राप्त कर सकते हैं? आसान होगा कि आपके कोड का हिस्सा देख रहे हों। मुझे लगता है कि हो सकता है कि आप अपने यूआई में 'चयनित' कर रहे हैं या 'चयनित' के खिलाफ टेम्पलेट का उपयोग कर रहे हैं? –

+0

@RomanBataev: कुछ भी नहीं है vm.selected सीधे। एडिटम() में पास किया गया डेटा अवलोकन योग्य में आइटमवापर से है। चयनित चर फिर सरणी में आइटम को इंगित करता है। बिंदु (2) के रूप में दर्शाता है कि यह अलग-अलग गुणों को पार करते समय यूआई के लिए बाध्य है, लेकिन जब आइटम (यारिएबल) में आइटमवापर को पास नहीं किया जाता है। – jaffa

उत्तर

6

OK- मुद्दा यह है कि अपने क्लोन उन पर मानचित्रण मेटा डेटा के साथ खत्म होता है और जब ko.mapping.fromJS बुला की कोशिश कर अंत में इस प्रत्यावर्तन का कारण बनता है।

समाधान ko.toJS के बजाय ko.mapping.toJS का उपयोग करके अपने क्लोन बनाने के लिए है, ताकि आपको क्लीन क्लोन (मेटा-डेटा मैप किए बिना) मिल सके। http://jsfiddle.net/rniemeyer/tDDBp/

+0

इसके लिए धन्यवाद। निश्चित नहीं है कि ko.toJS मैपिंग डेटा क्यों रखेगा और ko.mapping.toJS नहीं करता है। – jaffa

+0

ko.mapping।toJS विशेष रूप से मैपिंग विकल्पों के बारे में जानता है और उन्हें हटा देता है, जबकि ko.toJS को मैपिंग प्लगइन के बारे में कोई जानकारी नहीं है। –

0

कुछ मैं भी आज पर ठोकर खाई है कि मैं मैं का हिस्सा था सोचा: आप का प्रयोग क्लोन तो

:

var clone = ko.mapping.fromJS(ko.mapping.toJS(itemToClone)); 

तब क्लोन हो जाएगा

यहाँ एक अद्यतन बेला है किसी भी गणना किए गए अवलोकनों से छीन लिया। वे फ़ंक्शन के अंतिम मान के रूप में मौजूद होंगे, लेकिन अब गणना किए गए अवलोकन के रूप में कार्य नहीं करेंगे।

तो अपने मद गणना की observables कि आप निम्न अपने क्लोन पर रखने के लिए आप कर सकते हैं चाहते हैं के साथ एक जटिल मॉडल है:

var clone = ko.mapping.fromJS(ko.mapping.toJS(itemToClone), null, new itemModel()); 

कहाँ itemModel अपने मद अपनी गणना observables होने के कारण उसे अपने जटिल मॉडल है।

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