2012-03-15 18 views
19

मेरे पास ऑब्जेक्ट्स के observableArray (नाम 'सभी') के साथ एक दृश्य मॉडल है। उस ऑब्जेक्ट के गुणों में से एक observable नाम चुना गया है। जब भी सरणी में बच्चे ऑब्जेक्ट की चयनित संपत्ति बदलती है, तो मैं कुछ कोड निष्पादित करना चाहता हूं। मैंने all पर all.subscribe() के माध्यम से मैन्युअल रूप से सदस्यता लेने का प्रयास किया लेकिन वह कोड केवल तभी आग लग जाता है जब आइटम जोड़े या हटा दिए जाते हैं। मैंने कोड को इस तरह करने के लिए अद्यतन किया:नॉकआउट। जेएस पर्यवेक्षित ऐरे व्यक्तिगत अवलोकन करने योग्य वस्तुओं में परिवर्तन

all.subscribe(function() { 
    ko.utils.arrayForEach(all(), function (item) { 
     item.selected.subscribe(function() { 
      //code to fire when selected changes 
     }); 
    }); 
}); 

क्या यह करने का यह सही तरीका है या कोई बेहतर तरीका है?

उत्तर

20

यह सही के करीब है। अवलोकन योग्य सरणी सदस्यता केवल तब होती है जब आइटम जोड़े या हटा दिए जाते हैं, संशोधित नहीं होते हैं।

कुंजी बिंदु:: तो अगर आप एक आइटम खुद की सदस्यता के लिए चाहते हैं, आप के लिए, ठीक है, स्वयं आइटम की सदस्यता की आवश्यकता होगी एक observableArray पटरियों जो वस्तुओं सरणी में कर रहे हैं, उन में से राज्य नहीं ऑब्जेक्ट्स

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

(from Knockout documentation)


मैं कहता हूँ जब से तुम सभी पुराने सदस्यता निकालना चाहते हैं जाएगा "सही करने के लिए बंद"। वर्तमान में, यदि अवलोकन योग्य सरणी [a, b] के रूप में शुरू होती है तो आप [a, b] की सदस्यता ले रहे हैं, लेकिन फिर c जोड़े जाने पर आपके पास a और b प्लस वन c के लिए दो सदस्यताएं हैं।

+0

यदि मैं पुरानी सरणी को 'सभी ([])' से उड़ाता हूं, तो क्या वह सभी सब्सक्रिप्शन को मार देगा? उपयोगकर्ता वास्तव में इस संग्रह से सीधे बातचीत नहीं करता है, यह चेक बॉक्स के संग्रह की तरह है और गतिशील रूप से नहीं बदला गया है। – arb

+0

फिर यह एक अवलोकन योग्य सरणी क्यों है? बस इसे एक सामान्य सरणी बनाएं जिसमें अवलोकन योग्य गुण वाली वस्तुएं हों। – Domenic

+0

वास्तव में आपके प्रश्न का उत्तर देने के लिए हालांकि: नहीं, यह नहीं होगा। सदस्यता केवल 'subscription.dipose()' को कॉल करके निपटाई जाती है, जैसा कि http://knockoutjs.com/documentation/observables.html – Domenic

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