web-dev-qa-db-ja.com

angularディレクティブ内で元のトランスクルージョンされたコンテンツを取得する

私の目標は、ユーザーが属性がアタッチされている任意の要素のHTMLを編集できるようにするeditableディレクティブを作成することです(プランカーを参照: http://plnkr.co/edit/nIrr9Lu0PZN2PdnhQOC6 =)

このalmostは、テキスト領域を初期化するためにトランスクルージョンされたコンテンツの元の生のHTMLを取得できないことを除いて機能します。 clone.text()からテキストを取得できますが、_<H1>_、_<div>_などのHTMLタグがないため、編集せずに[適用]をクリックすることはべき等ではありません。

メソッド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ディレクティブ で元のトランスクルージョンされたコンテンツを取得します)

22
prototype

$element.innerHTMLには元のHTMLが含まれている必要があります。私はそれが含まれていることを示しています

  <div class="editable">
  <span class="glyphicon glyphicon-edit" ng-click="toggleEditor()"></span>

    <div class="editable-input" ng-show="showEditor">
       <b><p>Enter well-formed HTML content:</p></b>
       <p>E.g.<code>&lt;h1&gt;Hello&lt;/h1&gt;&lt;p&gt;some text&lt;/p&gt;&lt;clock&gt;&lt;/clock&gt;</code></p>
       <textarea ng-model="editContent"></textarea>
       <button class="btn btn-primary" ng-click="onEdit()">apply</button>
    </div>

    <div class="editable-output" ng-transclude=""></div>
  </div>
3