我正在编写一个与 ng-repeat 非常相似的指令,但有一些区别。我正在创建多个 documentFragment 并将 transcludeFn(clone) 输出附加到多个 documentFragment 之一。在迭代结束时,我将这些 documentFragments 附加到父元素。
现在,我不是在寻找该指令的替代方案。我非常清楚我可以在我的指令模板中使用多个 ng-repeat,而无需自己创建 dom 元素。
元素以其各自的范围呈现。最后一切看起来都很好,但问题是,当我将克隆元素(transclude 函数输出)添加到 documentFragments 并因此将它们添加到 dom 树时,角度不知何故错过了 dom 元素及其范围之间的链接。
angular.element(createdDomElement).scope() 返回父范围而不是 createdDom 自己的范围。
更新: 我发现由于某种原因,创建的 dom 元素上的 ng-scope 类在渲染视图后消失了!
.directive('itemGrid', ['$window', function ($window) {
return {
transclude: 'element',
priority: 1000,
terminal: true,
compile: function compile($elem, $attrs, linker) {
return function (scope, elem, attrs) {
var attrData = attrs.itemGrid,
match = attrData.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/),
indexString = match[1],
collection = scope.$eval(match[2]);
drawGrid = function (numberOfColumns) {
columns = Array.apply(null, new Array(numberOfColumns)).map(function () {
return document.createDocumentFragment(); // row fragments
});
var cloneIt = function (clone) {
columns[columnIndex].insertBefore(clone[0], null);
};
for (i = 0; i < collection.length; i++) {
------ calculate columnIndex------
var newScope = scope.$new();
newScope[indexString] =collection[i];
linker(newScope, cloneIt);
}
columnsFragment = document.createDocumentFragment();
for (i = 0; i < columns.length; i++) {
column = document.createElement('ul');
column.className = columnClasses;
column.appendChild(columns[i]);
columnsFragment.appendChild(column);
}
elem.parent()[0].appendChild(columnsFragment);
};
}