2013-11-21 10 views
16

Ich habe eine Direktive, die ich für die Formvalidierung verwendet, die ich vor kurzem überarbeitet habe. Erlauben Sie mir, die Richtlinie ein wenig weiter zu erläutern, bevor ich sie erweitere.Rufen Sie das innere HTML der AngularJS-Direktive ab, bevor TemplateUrl es überschreibt

Die Richtlinie Nutzung:

<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> 

Zuvor sah meine Richtlinie so etwas, und es arbeitete.

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-Template wurde immer chaotisch, und ich wollte, dass die Tasten ‚innen‘ der Vorlage wickeln, anstatt sie nach. Also überlegte ich, was ich für eine viel bessere Richtlinie hielt.

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(' ', '') === '') 
      }; 

     } 
    }; 
}]); 

Was ist also ich bemerken, dass element.html() nun den Inhalt des templateUrl ruft anstelle des Inhalts der inneren HTML meine Richtlinie. Wie sonst kann ich den Inhalt meiner Direktive abrufen, bevor sie von TemplateUrl überschrieben wird?

Antwort

10

Für den Zugriff auf die iniital html kann $transclude in Directive Controller verwenden. Dies ist eine geringfügige Änderung von früheren Versionen so annimmt mit 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

Dies tut genau das, was Sie sagen, und ist die richtige Antwort, wenn auch als ein Follow-up - Bindung des übergebenen HTML-Code in Die templateUrl über ng-bind-html mit $ sce.trustAsHtml() verfälscht die Click-Events, die mit dem Scope übergeben werden. Liegt dies an der Anwesenheit eines neuen Verantwortlichen in der Richtlinie? –

+0

nicht sicher, way, dass Sie das verwenden, um ehrlich zu sein ... einfach die HTML-Eingabe aus dem Geltungsbereich wird nicht kompiliert werden. Erstellen Sie eine Demo. Alles in allem bin ich ein wenig verwirrt über das, was Sie tun .... nur gab Ihnen eine Möglichkeit, auf den HTML-Code zugreifen, wie gewünscht. Du kannst plocker verwenden, um die templateURL zu importieren ... einfach eine Datei mit dem html darin erstellen und die URL auf das gleiche Verzeichnis (nur Datei) einstellen. – charlietfl

+0

Danke, wir werden es ein bisschen länger hacken. Und werde ein Update veröffentlichen, wenn ich herausfinden werde, was das Problem ist. Wahrscheinlich etwas mit meinem Code zu tun. Wie ich schon sagte, dies ist die richtige Antwort auf die eigentliche Frage, egal, danke! –

Verwandte Themen