मैंने एनजी-दोहराया और कोड ब्लॉक को निकाला, यह देखते हुए कि एल्गोरिदम को दोहराते हुए तर्क शामिल है (जिसे मैं समझना चाहता हूं कि यह कैसे काम करता है)।एनजी-दोहराना कैसे काम करता है?
मेरे पास कुछ प्रश्न हैं, लेकिन चूंकि वे एनजी-दोहराने के आंतरिक के बारे में हैं, इसलिए मैंने उनसे उनसे पूछना चुना। मुझे उन्हें अलग-अलग SO प्रश्नों में अलग करने का कोई कारण नहीं दिख रहा है। मैंने प्रत्येक प्रश्न को संदर्भित कोड की कौन सी पंक्ति (रेखा) के लिए इनलाइन चिह्नित की है।
- क्यों वे यह सुनिश्चित करें कि
trackById
देशीhasOwnProperty
कार्य नहीं है बनाने के लिए की जरूरत है? (यही वह है जोassertNotHasOwnProperty
फ़ंक्शन करता है, कोणीय के आंतरिक एपीआई का हिस्सा) - जहां तक मेरा अंतर्ज्ञान जाता है, यह कोड पहले से ही पुनरावर्तक में आइटम पर निष्पादित होता है, जब इसे संग्रह को अपडेट करना होता है - यह सिर्फ उन्हें उठाता है और उन्हें धक्का देता है प्रसंस्करण के लिए सूची में, सही?
- यह कोड ब्लॉक पुनरावर्तक संग्रह में डुप्लिकेट की तलाश करता है। लेकिन यह वास्तव में ऐसा करता है जो मेरे बाहर है। कृपया समझाएँ।
- कोणीय को
nextBlockOrder
मेंnextBlockMap
और दोनों ब्लॉक ऑब्जेक्ट को स्टोर करना क्यों है? block.endNode
औरblock.startNode
क्या हैं?- मुझे लगता है कि उपर्युक्त प्रश्न का उत्तर यह बताएगा कि यह एल्गोरिदम कैसे काम करता है, लेकिन कृपया यह बताने की ज़रूरत है कि
nextNode
'$$NG_REMOVED'
है या नहीं? - यहां क्या होता है? दोबारा, मुझे लगता है कि प्रश्न 6 पहले से ही इसका जवाब देगा। लेकिन अभी भी यह इंगित कर रहा है।
जैसा कि मैंने कहा था, मैंने कोड को दोहराने के लिए दोहराए गए कोड को खोजने के लिए दोहराना दोहराया है। इसके अलावा, मैं बाकी निर्देश को समझता हूं। तो आगे की हलचल के बिना, यहाँ कोड (v1.2.0 से) है:
length = nextBlockOrder.length = collectionKeys.length;
for (index = 0; index < length; index++) {
key = (collection === collectionKeys) ? index : collectionKeys[index];
value = collection[key];
trackById = trackByIdFn(key, value, index);
// question #1
assertNotHasOwnProperty(trackById, '`track by` id');
// question #2
if (lastBlockMap.hasOwnProperty(trackById)) {
block = lastBlockMap[trackById];
delete lastBlockMap[trackById];
nextBlockMap[trackById] = block;
nextBlockOrder[index] = block;
// question #3
} else if (nextBlockMap.hasOwnProperty(trackById)) {
// restore lastBlockMap
forEach(nextBlockOrder, function(block) {
if (block && block.startNode) lastBlockMap[block.id] = block;
});
// This is a duplicate and we need to throw an error
throw ngRepeatMinErr('dupes', "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}",
expression, trackById);
// question #4
} else {
// new never before seen block
nextBlockOrder[index] = { id: trackById };
nextBlockMap[trackById] = false;
}
}
for (index = 0, length = collectionKeys.length; index < length; index++) {
key = (collection === collectionKeys) ? index : collectionKeys[index];
value = collection[key];
block = nextBlockOrder[index];
// question #5
if (nextBlockOrder[index - 1]) previousNode = nextBlockOrder[index - 1].endNode;
if (block.startNode) {
// if we have already seen this object, then we need to reuse the
// associated scope/element
childScope = block.scope;
// question #6
nextNode = previousNode;
do {
nextNode = nextNode.nextSibling;
} while(nextNode && nextNode[NG_REMOVED]);
if (block.startNode != nextNode) {
// existing item which got moved
$animate.move(getBlockElements(block), null, jqLite(previousNode));
}
previousNode = block.endNode;
} else {
// new item which we don't know about
childScope = $scope.$new();
}
// question #7
if (!block.startNode) {
linker(childScope, function(clone) {
clone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' ');
$animate.enter(clone, null, jqLite(previousNode));
previousNode = clone;
block.scope = childScope;
block.startNode = previousNode && previousNode.endNode ? previousNode.endNode : clone[0];
block.endNode = clone[clone.length - 1];
nextBlockMap[block.id] = block;
});
}
}
lastBlockMap = nextBlockMap;