2013-11-21 6 views
16

私が最近リファクタリングしたフォーム検証用定型句に使用するディレクティブがあります。拡大する前に指示をもう少し説明することができます。templateUrlが上書きする前にAngularJSディレクティブの内部HTMLを取得

ディレクティブの使用:

<form class="form-horizontal" name="personalDetails" validated-form> 

    <!-- Pass buttons into form through here --> 
    <a href="" class="btn btn-success" 
     data-ng-click="saveDetails()" 
     data-ng-disabled="!personalDetails.$valid">Save Changes</a> 

</form> 

は以前、私のディレクティブは、このような何かを見て、それを働きました。

app.directive('validatedForm', function($compile, $sce) { 
    return { 
     restrict: 'A', 
     scope: true, 
     link: function(scope, element, attrs) { 

      var template = //... HTML boilerplate code 
      var buttons = element.html(); // Get contents of element before overriding 

      element.html(template + buttons); 
      $compile(element.contents())(scope); 

     } 
    } 
}); 

htmlテンプレートが乱雑になり、テンプレートの内側にあるボタンをラップしたいと思いました。だから、私はもっと良い指示であると思ったものにリファクタリングしました。

app.directive('validatedForm', ['$compile', '$sce', function ($compile, $sce) { 

    var domContent = null; 

    return { 
     restrict: 'AE', 
     scope: true, 
     templateUrl: '/Content/ngViews/directives/validated-form.html', 
     link: function(scope, element, attrs) { 

      // This now returns the contents of templateUrl 
      // instead of what the directive had as inner HTML 
      domContent = element.html(); 

      // Scope 
      scope.form = { 
       caption: attrs.caption, 
       location: 'Content/ngViews/forms/' + attrs.name + '.html', 
       buttons: $sce.trustAsHtml(domContent), 
       showButtons: !(domContent.replace(' ', '') === '') 
      }; 

     } 
    }; 
}]); 

それでは、私は気づいてることelement.htmlは()今templateUrlの内容の代わりに、私の指示の内側のHTMLの内容を取得することです。 templateUrlによって上書きされる前に、私のディレクティブの内容をどのように取得できますか?

答えて

10

iniital htmlにアクセスするには、ディレクティブコントローラ内で$transcludeを使用できます。渡されたHTMLを結合 - これは、ようにフォローアップが、これは、あなたが言うまさに行い、正しい答えである1.2

controller:function($scope,$transclude){ 
     $transclude(function(clone,scope){ 
     /* for demo am converting to html string*/ 
     $scope.buttons=angular.element('<div>').append(clone).html(); 
     }); 

    } 

DEMO

+0

を使用して想定して、以前のバージョンからのわずかな変化であります$ sce.trustAsHtml()を使用するng-bind-htmlによるtemplateUrlは、スコープで渡されるクリックイベントを混乱させます。これは指令の中に新しいコントローラが存在するためですか? –

+0

正直言ってそれを使用しているのかどうかわからない...単にhtmlをスコープから渡すだけではコンパイルされません。デモを作成します。全体的にあなたは何をしているのかちょっと混乱しています....ちょうどあなたが要求どおりにHTMLにアクセスする方法を教えました。 plunkerを使用してtemplateURLをインポートすることができます。ちょうどhtmlを含むファイルを作成し、同じディレクトリ(URLのみ)に調整します – charlietfl

+0

ありがとうございます。問題が何であるかを知ると、アップデートを投稿します。おそらく私のコードと関係があります。私が言ったように、これは関係なく、本当の質問への正しい答えです、ありがとう! –

関連する問題