जब आपके पास गैर अवलोकन तत्वों के साथ एक अवलोकन योग्य सरणी है, और सरणी में तत्वों में से किसी एक के गुणों में परिवर्तन , यदि आप केवल उस तत्व को ताज़ा करना चाहते हैं, तो आप indexOf
और splice
, इस तरह उपयोग कर सकते हैं:
var changedIdx = obsArray.indexOf(changedItem);
obsArray.splice(changedIdx , 1); // removes the item from the array
obsArray.splice(changedIdx , 0, changedItem); // adds it back
यह क्या करता है,, सरणी में तत्व की तलाश में है इसे हटाने, और इसे वापस डालने। जब इसे वापस डाला जाता है, तो तत्व नए मानों के साथ फिर से बाध्य होता है। फिर, जब आप एक सरणी के एक आइटम बदलने
ko.observableArray.fn.refresh = function (item) {
var index = this['indexOf'](item);
if (index >= 0) {
this.splice(index, 1);
this.splice(index, 0, item);
}
}
, तो आप बस इस फोन करना है:
इस समाधान की तरह आप हैं, तो आप सभी को नमूदार सरणियों की कार्यक्षमता, इस तरह का विस्तार कर सकते हैं:
obsArray.refresh(changedItem);
आप अपने सरणी में कई तत्वों है, तो आप Artem Vyshniakov, जो सरणी में सभी तत्वों के लिए बाइंडिंग अद्यतन करता है के द्वारा dirty
ताज़ा करने के लिए सम्मान के साथ बेहतर प्रदर्शन को मिल जाएगा, और न केवल बदली हुई एक के लिए ।
नोट: valueHasMutated
, undocumented जा रहा है (और आंतरिक उपयोग के लिए, मुझे लगता है) से Appart, केवल जांच करता है कि सरणी में ही बदल गया है, नहीं करता है, तो सरणी में गैर नमूदार तत्वों को बदल दिया है, तो यह 'नहीं करता है टी काम नहीं अर्थात। यह केवल तभी पता लगाता है जब आपने सरणी में तत्व जोड़े हैं, सरणी से हटाए गए तत्व, सरणी के तत्वों को नए, अलग-अलग तत्वों के साथ बदल दिया है, या तत्वों के क्रम को बदल दिया है। लेकिन यह जांच नहीं करता है कि क्या तत्व स्वयं बदल गए हैं
यह अभी भी मेरे लिए यूआई अपडेट नहीं करता है – user1166905
valueHasMutated मेरे लिए ठीक काम करता है। – Edyn
स्लाइस (0) को कॉल करके आपको सरणी की एक प्रति बनाने की आवश्यकता क्यों है? निम्नलिखित कार्यों के साथ-साथ बेहतर 'var data = self.array(); self.array (null); self.array (डेटा); ' –