3

Ich baue eine benutzerdefinierte Login-Modul-Richtlinie mit Eltern Tag-Gehäuse Kind Tags wie Benutzername Passwort & ist. Ich habe Benutzername und Passwort im übergeordneten Bereich definiert und kommuniziert es mit Controller-Funktion.Unable Anwendungsbereich Eigenschaften der Eltern-Direktive in der Kind-Richtlinie zugreifen, wenn übergeordneter Bereich entweder wahr oder isoliert

angular.module('sampleModule', []) 
     .directive("parent",function(){return { 
      restrict : 'E', 
      transclude: true, 
      scope: false, 
      controller: function($scope, $element, $attrs){ 
       $scope.username = 'Init value'; 
       $scope.setUsername = function(name){ 
        $scope.username = name; 
       }; 
       $scope.getUsername = function(){ 
        return $scope.username; 
       } 
      }, 
      link: function(scope, element, attrs){ 
       element.find('button').on('click', function(event){ 
        alert('In Parent: '+ scope.username); 
       }); 
      }, 
      template: '<div id="loginForm"><label>Parent: {{username}}</label><button>Check</button><br><br><ng-transclude></ng-transclude></div>' 
     }}) 
     .directive("child",function(){return { 
      restrict : 'E', 
      require: '^parent', 
      scope: true, //parent scope is available only when its true or false 
      link: function(scope, element, attrs, parentCtrl){ 
       scope.$watch('username', function(newVal, oldVal){ 
        if(newVal!=oldVal){ 
         scope.setUsername(scope.username); 
        } 
       }); 
      }, 
      template: '<input id="username" type="text" ng-model="username"><label>In Child: {{username}}</label>' 
     }}); 

Es ist mein erstes Mal mit Richtlinien arbeiten, und ich habe folgende Zweifel:

  1. Können Kind Richtlinien erben von dem isolierten Rahmen der Mutterrichtlinie?

  2. Ich möchte, dass die Moduldaten gekapselt werden (d. H. Benutzername & Passwort-Informationen sind nicht an anderer Stelle in der App verfügbar). Ich denke also darüber nach, den Geltungsbereich der Eltern-Direktive auf Benutzerfelder zu beschränken, die isoliert werden sollen. Allerdings, wenn ich diesen übergeordneten Bereich Eigenschaften nicht im untergeordneten Bereich zugänglich machen. Wie behebe ich das?

  3. Wenn ich den Rahmen der Eltern-Richtlinie als false mache, werden seine Eigenschaften durch die Controller-Funktion zugänglich sein? Zum Beispiel: wird die Benutzername in SomeController?

    <div ng-controller="SomeController"> 
        <parent> 
         <child></child> 
        </parent> 
    </div> 
    

Antwort

0

Bringen Sie Ihre getUsername Funktion this statt -umfang:

this.getUsername = functon(){.... 

Dann in Ihrem Kind Richtlinie zugreifen können Sie es mit:

parentCtrl.getUsername(); 

Um das Kind Umfang zugreifen von der Eltern können Sie dies tun:

var child = element.find('child'); 
var childScope = childElem.isolateScope(); 
console.log(childScope.username); 
+0

Wie Sie bereits erwähnt haben, habe ich dem _this_ Eigenschaften zugewiesen und nicht den Bereich in der übergeordneten Richtlinie. Und ich musste die ** controllerAs ** -Eigenschaft in der Eltern-Direktive verwenden, um die Controller-Eigenschaften in der Eltern-Vorlage zu verwenden. 'controllerAs: ctrl' und im übergeordneten' template: '{{ctrl.username}}' '. ** Aber wie kann ich auf Controller-Eigenschaften in der Kind-Vorlage zugreifen?! ** Controller-Eigenschaften sind nur in der Link-Funktion des Kindes und nicht in der Vorlage – Pramodh

+0

nur an den Geltungsbereich, also in der Link-Funktion set 'scope.username = parentCtrl.getUsername(); 'Jetzt ist der Benutzername in der untergeordneten Vorlage als Bereichsvariable verfügbar –