2012-05-07 6 views
6

मेरे व्यूमोडेल में, मेरे पास नॉकआउटज ऑब्जरेबलएरे है। ViewModel को आरंभ करने के ठीक बाद, यह डेटा को सफलतापूर्वक बांधता है। फिर, संग्रह को सॉर्ट करने के लिए मुझे क्या करना है।knockoutjs ObservableArrays और सॉर्ट फ़ंक्शन: यूआई अपडेट नहीं किया गया है

$.each(vm.searchResults(), function (i, property) { 
    console.log(property.Name()); 
}); 

vm.searchResults().sort(function (a, b) { 
    return a.Name().toLowerCase() > b.Name().toLowerCase() ? 1 : -1; 
}); 

$.each(vm.searchResults(), function (i, property) { 
    console.log(property.Name()); 
}); 

जैसा कि आप देख सकते हैं, मैं सॉर्टिंग के पहले और बाद में ऑर्डर देखने के लिए तत्व का नाम कंसोल में आउटपुट करता हूं। सॉर्टिंग बस ठीक काम करता है। समस्या यूआई अपडेट के साथ है। किसी भी तरह, यूआई अद्यतन नहीं है।

फिर, निम्नलिखित कोड के साथ सरणी से एक रिकार्ड दूर करने के लिए करता है, तो यूआई कि या नहीं का जवाब देंगे देखने की कोशिश:

vm.searchResults().shift(); 

यूआई ही रहता है और फिर से अद्यतन नहीं किया। यहाँ समस्या क्या होगी?

संपादित करें: http://jsfiddle.net/tugberk/KLpwP/

एक ही समस्या यहाँ भी:

यहां नमूने के मामले के रूप में अच्छी तरह से है।

संपादित करें: http://jsfiddle.net/tugberk/KLpwP/16/ लेकिन मैं अभी भी यकीन नहीं है क्यों यह काम के रूप में मैं पहली बार में करने की कोशिश की:

मैं के रूप में इस नमूने में बताया गया समस्या हल हो।

उत्तर

18

जब आप इसे सॉर्ट करने जा रहे हैं तो आप अवलोकन करने योग्य सरणी को खोल रहे हैं। यह समस्या का कारण बनता है, क्योंकि केओ ट्रैक नहीं कर सकता सरणी बदल दी गई थी। ko.observableArray() में sort समान हस्ताक्षर के साथ कार्य है और यह अवलोकन करने योग्य ग्राहकों को सूचित करेगा कि यह बदला गया है। समाधान बहुत आसान है: ब्रेसिज़ vm.searchResults().sort =>vm.searchResults.sort हटाएं। मेरा उदाहरण चेकआउट करें: http://jsfiddle.net/RbX86/

केओ को बताने का एक और तरीका है कि सरणी में बदलाव आया है - सरणी के साथ हेरफेर के बाद valueHasMutated विधि को कॉल करें। कृपया इस नमूना की समीक्षा करें: http://jsfiddle.net/RbX86/1/ यह दृष्टिकोण बहुत अच्छा है जब आपको अपनी सरणी में कई बदलाव करने की आवश्यकता होती है और आप केवल एक बार यूआई रीफ्रेश करना चाहते हैं।