Issue mit isoliertem Gültigkeitsbereich und "replace: true" in der eckigen Direktive

Ich habe Probleme mit dem Gültigkeitsbereich, wenn ich mit AngularJS eine Fehlermeldung erstellt habe.

Ich habe eine ng-if- und eine ng-class-Direktive als Teil der Direktivenvorlage, aber der Ausdruck in der ng-class-Direktive schien immer eine leere Zeichenfolge zurückzugeben, es sei denn:

Ich habe die ng-if-Direktive entfernt.oder, ich habe den 'Ersetzen'-Schlüssel im Direktivendefinitionsobjekt entfernt.

Betrachtet man die kompilierte Ausgabe für meine Direktive, so sieht es so aus, als würde ein isolierter Bereich erstellt, wenn der ng-if- oder der Ersetzungsschlüssel entfernt wird, aber wenn beide in belassen werden, dann gibt es keine Klassen in ng-isolate-scope die HTML-Ausgabe, nur ng-scope.

Ich würde wirklich gerne genau verstehen, was hier vor sich geht und wäre für Erklärungen dankbar.

Direktive Definition

angular.module('myMessages')
.directive('pageMessages', function() {

    return {
        restrict: 'E',
        replace: true,
        scope: {
            messages: '='
        },
        controller: function($scope) {
            $scope.severity = 'alert-success';
        },
        template: '<div ng-if="messages.length > 0">' +
                    '<div class="alert" ng-class="severity">' + 
                        '<ul>' + 
                            '<li ng-repeat="m in messages">{{::m.message}}</li>' +
                        '</ul>' +
                    '</div>' +
                  '</div>'
    };
});

Output (beachten Sie, dass keine Alert-Gefahrenklasse hinzugefügt wird)

<!-- ngIf: messages.length > 0 -->
<div ng-if="messages.length > 0" messages="messages" class="ng-scope">
    <div class="alert" ng-class="severity">
        <ul>
        <!-- ngRepeat: m in messages -->
            <li ng-repeat="m in messages" class="ng-binding ng-scope">test error</li>
        <!-- end ngRepeat: m in messages --></ul>
    </div>
</div>
<!-- end ngIf: messages.length > 0 --></div>

alert-danger class wird nach dem Entfernen von replace hinzugefügt (Entfernen von ng-if würde ebenfalls funktionieren)

<page-messages messages="messages" class="ng-isolate-scope">
    <!-- ngIf: messages.length > 0 -->
    <div ng-if="message,s.length > 0" class="ng-scope">
        <div class="alert alert-danger" ng-class="severity">
            <ul>
            <!-- ngRepeat: m in messages -->
                <li ng-repeat="m in messages" class="ng-binding ng-scope">test error</li>
            <!-- end ngRepeat: m in messages -->
            </ul>
        </div>
    </div>
    <!-- end ngIf: messages.length > 0 -->
</page-messages>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage