Я потратил 3 часа на изучение исходного кода Углового (это написано так трудно читать) и нашел ответ на мой вопрос. Угловой не различает элементы шаблона и экземпляра внутри, он работает с тем же деревом, которое имеет при начале компиляции. Вот суть исходного кода, который демонстрирует, что:
var element = $("body");
compile(element)($rootScope);
function compile(DOMElementsTree) {
var compositeLinkFn = compileNodes(DOMElementsTree);
return function publicLinkFn(scope) {
var $linkNode = DOMElementsTree;
compositeLinkFn(scope, $linkNode);
return $linkNode;
}
}
function compileNodes(nodesList) {
var linkFns = [];
nodesList.forEach(function (node) {
var nodeLinkFn = applyDirectivesToNode(node);
var childNodes = nodesList.childNodes;
var childLinkFn = !!childNodes.length ? compileNodes(childNodes) : null;
if (nodeLinkFn || childLinkFn) {
linkFns.push(i, nodeLinkFn, childLinkFn);
}
});
return function compositeLinkFn(scope, nodeList) {
linkFns.forEach(function (linkFn) {
var nodeLinkFn = linkFn[1];
var childNodeLinkFn = linkFn[2];
if (nodeLinkFn) {
nodeLinkFn(childLinkFn, scope, nodeList);
} else if (childNodeLinkFn) {
childLinkFn(scope, nodeList)
}
});
}
}
function applyDirectivesToNode() {
// this is where compile functions of all directives on a node are executed
}
function nodeLinkFn() {
// here pre link and post link functions are executed
}
function childLinkFn() {
// here pre link and post link functions are executed
}
Вы можете видеть, что applyDirectivesToNode
, который выполняет функцию compile
директивы не возвращает новый узел DOM, вместо этого он изменяет DOMElementsTree
, что он получает с помощью ссылок и compositeLinkFn
продолжает работать с этим экземпляром DOM.
Изначально у меня был этот кусок образец кода в мой вопрос с from here:
var $compile = ...; // injected into your code
var scope = ...;
var parent = ...; // DOM element where the compiled template can be appended
var html = '<div ng-bind="exp"></div>';
// Step 1: parse HTML into DOM element
var template = angular.element(html);
// Step 2: compile the template
var linkFn = $compile(template);
// Step 3: link the compiled template with the scope.
var element = linkFn(scope);
// Step 4: Append to DOM (optional)
parent.appendChild(element);
Таким образом, в этом экстракте последний шаг имеет дело с результатом функции publicLinkFn
, а именно $linkNode
в моем коде выше.
Что вы подразумеваете под _ready_? Вы уже знаете, что элемент создан на шаге 1. Его можно изменить на любом из следующих шагов. – zeroflagL
Я полностью переписал свой вопрос, чтобы уточнить, что я прошу –
@zeroflagL, исследовал вопрос, пожалуйста, посмотрите мой ответ, если он будет заинтересован. –