2012-11-05 18 views
22

असल में मेरे पास एक अवलोकन योग्य है और प्रत्येक आइटम के मान मूल्यवान नहीं हैं। इसका अर्थ यह है कि जब मैं एक आइटम मान बदलता हूं तो यूआई देखने योग्य ऐरे के फ़ोरैच लूप के भीतर यूआई तदनुसार अपडेट नहीं होता है।अवलोकन रीफ्रेश करें जब आइटम अवलोकन योग्य नहीं हैं

इसका मतलब है कि अगर मुझे उन्हें देखने योग्य सेट करना है तो एक बड़ा परिवर्तन है, तो क्या कोई तरीका है कि मैं यूआई या अवलोकन योग्य रीरेच मैन्युअल रूप से रीफ्रेश कर सकता हूं?

उत्तर

46

हाँ, आप valueHasMutated समारोह अपने सरणी के लिए कॉल कर सकते हैं:

yourArray.valueHasMutated(); 

संपादित करें: तो पहले आप 'गंदा' ताज़ा कर सकते हैं मदद नहीं की:

self.refresh = function(){ 
    var data = self.array().slice(0); 
    self.array([]); 
    self.array(data); 
}; 

यहाँ काम कर रहा है बेला : http://jsfiddle.net/vyshniakov/FuEy6/2/

+5

यह अभी भी मेरे लिए यूआई अपडेट नहीं करता है – user1166905

+1

valueHasMutated मेरे लिए ठीक काम करता है। – Edyn

+7

स्लाइस (0) को कॉल करके आपको सरणी की एक प्रति बनाने की आवश्यकता क्यों है? निम्नलिखित कार्यों के साथ-साथ बेहतर 'var data = self.array(); self.array (null); self.array (डेटा); ' –

5

मैंने ऊपर से गंदे दृष्टिकोण का उपयोग करके समाप्त किया लेकिन इसे बनाया ताकि मेरे सभी अवलोकन योग्य सरणी में यह कार्यक्षमता हो।

ko.observableArray.fn.refresh = function() { 
     var data = this().slice(0); 
     this([]); 
     this(data); 
    }; 

valueHasMutated मेरे लिए काम नहीं करता है। इसकी तरह की लंगड़ा पूरी सूची को अद्यतन किया जाना है। या मेरे मामले में देखने योग्य वस्तुओं के साथ अवलोकन योग्य सरणी भरने के लिए को मैपिंग प्लगइन का विस्तार करने का एक तरीका खोजें ..

+2

'var data = this()/*। टुकड़ा() * /; यह (शून्य); यह (डेटा); 'काम करेगा और साथ ही तेज़ –

16

जब आपके पास गैर अवलोकन तत्वों के साथ एक अवलोकन योग्य सरणी है, और सरणी में तत्वों में से किसी एक के गुणों में परिवर्तन , यदि आप केवल उस तत्व को ताज़ा करना चाहते हैं, तो आप 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, केवल जांच करता है कि सरणी में ही बदल गया है, नहीं करता है, तो सरणी में गैर नमूदार तत्वों को बदल दिया है, तो यह 'नहीं करता है टी काम नहीं अर्थात। यह केवल तभी पता लगाता है जब आपने सरणी में तत्व जोड़े हैं, सरणी से हटाए गए तत्व, सरणी के तत्वों को नए, अलग-अलग तत्वों के साथ बदल दिया है, या तत्वों के क्रम को बदल दिया है। लेकिन यह जांच नहीं करता है कि क्या तत्व स्वयं बदल गए हैं

+0

सुंदर, उपयोगी सामान धन्यवाद – Andrew

+0

ध्यान दें कि' obsArray.indexOf() 'तत्वों को ढूंढें, इसे' === 'का उपयोग करके मानते हैं लेकिन जावास्क्रिप्ट' {'x': 'X'} === {'x': 'X'} 'झूठी झूठी –

+0

आप सही हैं। हालांकि, इस परिदृश्य में ** आपके पास सरणी तत्व का संदर्भ है जिसे आप mofidy ** करना चाहते हैं। आप उस ऑब्जेक्ट को संशोधित नहीं कर रहे हैं जो सरणी में एक जैसा दिखता है, लेकिन सरणी में ऑब्जेक्ट। तो, 'indexOf' का उपयोग करके इसे मिल जाएगा। यदि आपने किसी ऑब्जेक्ट को बदल दिया है जो सरणी में नहीं है, तो आपको ऑब्जेक्ट को सरणी में नए से बदलना होगा, जो कि ** सरणी में एक तत्व को बदलने के गुणों से भिन्न है ** और यह सूचित करता है कि यह बदल गया है, दूसरा मामला पूरी तरह से अलग है। – JotaBe

0

मुझे पूरे ऑब्जेक्ट को सरणी में बदलकर एक सरल समाधान मिला।

इस उदाहरण पैरामीटर ix में सूचकांक है, oline अद्यतन वस्तु और oVM.objProps है।लाइनें में सरणी है। समाधान एक चैंप की तरह काम किया।

/* This contortion causes the computed function to fire because 
* we have replaced the entire line object. 
*/ 
function forceRefresh(ix,oLine) { 
    var oVM = pme.getVM(); 
    oLine = JSON.parse(JSON.stringify(oLine)); 
    oVM.oObjProp.lines[ix] = oLine; 
} 
संबंधित मुद्दे