Моя цель — создать директиву editable
, которая позволит пользователю редактировать HTML любого элемента, к которому прикреплен атрибут (см. Plunker: http://plnkr.co/edit/nIrr9Lu0PZN2PdnhQOC6)
Это почти работает, за исключением того, что я не могу получить исходный необработанный HTML-код включенного контента для инициализации текстовой области. Я могу получить его текст из clone.text()
, но в нем отсутствуют теги HTML, такие как <H1>
, <div>
и т. д., поэтому нажатие кнопки «Применить» без изменений не является идемпотентным.
Метод clone.html()
выдает ошибку, Cannot read property 'childNodes' of undefined
app.directive("editable", function($rootScope) {
return {
restrict: "A",
templateUrl: "mytemplate.html",
transclude: true,
scope: {
content: "=editContent"
},
controller: function($scope, $element, $compile, $transclude, $sce) {
// Initialize the text area with the original transcluded HTML...
$transclude(function(clone, scope) {
// This almost works but strips out tags like <h1>, <div>, etc.
// $scope.editContent = clone.text().trim();
// this works much better per @Emmentaler, tho contains expanded HTML
var html = "";
for (var i=0; i<clone.length; i++) {
html += clone[i].outerHTML||'';}
});
$scope.editContent = html;
$scope.onEdit = function() {
// HACK? Using jQuery to place compiled content
$(".editable-output",$element).html(
// compiling is necessary to render nested directives
$compile($scope.editContent)($rootScope)
);
}
$scope.showEditor = false;
$scope.toggleEditor = function() {
$scope.showEditor = !$scope.showEditor;
}
}
}
});
(Этот вопрос, по сути, полностью переписывает вопрос и код после более ранней попытки сформулировать вопрос, Получить исходный включенный контент в директиве Angular)
clone
— это набор элементов. Вы смогли проверить это в отладчике? - person Nathaniel Johnson   schedule 20.11.2013var text = ""; for (var i=0; i<clone.length; i++) {text += clone[i].outerHTML||'';}
. Однако один оставшийся пробел заключается в расширении HTML вложенных директив, например. вместо<clock></clock>
показывает<clock><span class="clock"><div class="btn btn-success"><h1>Clock</h1><p>{{time}}</p></div></span></clock>
. В этом примере часы не включают контент, поэтому общий эффект тот же. Интересно, можно ли получить исходный HTML? - person prototype   schedule 20.11.2013