Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | 2x 3x 5x 9x 9x 9x 12x 12x 2x 2x 24x 16x 8x 10x 16x 16x 10x 10x 10x 10x 10x 12x 12x 6x 12x 12x 14x 14x 12x 12x 2x | /* eslint no-unused-vars: 0 */
/* eslint import/prefer-default-export: 0 */
// eslint-disable-next-line import/no-extraneous-dependencies
const NODE_TYPE_TEXT = 3;
export const crTranscludeDirectiveFactory = (angular) => ([
'$compile',
($compile) => ({
restrict: 'EAC',
compile: function crTranscludeCompile(tElement) {
// Remove and cache any original content to act as a fallback
const fallbackLinkFn = $compile(tElement.contents());
tElement.empty();
return function crTranscludePostLink(
$scope,
$element,
$attrs,
_controller,
$transclude,
) {
let context = null;
let childScope = null;
function useFallbackContent() {
// Since this is the fallback content rather than the transcluded content,
// we link against the scope of this directive rather than the transcluded scope
fallbackLinkFn($scope, (clone) => {
$element.append(clone);
});
}
function updateScope(scope, varsHash) {
if (!scope || !varsHash) {
return;
}
angular.extend(scope, varsHash);
}
function notWhitespace(nodes) {
for (let i = 0, ii = nodes.length; i < ii; i += 1) {
const node = nodes[i];
if (node.nodeType !== NODE_TYPE_TEXT || node.nodeValue.trim()) {
return true;
}
}
return false;
}
function transcludeCloneAttachFn(clone, transcludedScope) {
Eif (clone.length && notWhitespace(clone)) {
$element.append(clone);
childScope = transcludedScope;
updateScope(childScope, context);
} else {
useFallbackContent();
/*
* There is nothing linked against the transcluded scope
* since no content was available,
* so it should be safe to clean up the generated scope.
*/
transcludedScope.$destroy();
}
}
Iif (!$transclude) {
throw new Error(
'orphan',
'Illegal use of crTransclude directive in the template! '
+ 'No parent directive that requires a transclusion found. '
+ 'Element: {0}',
);
}
/*
* If the attribute is of the form: `ng-transclude="ng-transclude"`
* then treat it like the default
*/
if ($attrs.crTransclude === $attrs.$attr.crTransclude) {
// eslint-disable-next-line no-param-reassign
$attrs.crTransclude = '';
}
const slotName = $attrs.crTransclude || $attrs.crTranscludeSlot;
$scope.$watch($attrs.context, (newVal, _oldVal) => {
context = newVal;
updateScope(childScope, context);
});
/*
* If the slot is required and no transclusion content
* is provided then this call will throw an error
*/
$transclude(transcludeCloneAttachFn, null, slotName);
/*
* If the slot is optional and no transclusion content
* is provided then use the fallback content
*/
if (slotName && !$transclude.isSlotFilled(slotName)) {
useFallbackContent();
}
};
},
}),
]);
|