2016-03-20 4 views
0

ich auf einer AngularJS App arbeite, habe ich eine Richtlinie verwenden und einen ControllerUmfang Kind Kopf/Schwanz ist null

die Richtlinie ist für eine Liste von sättigt holen und auf ausgewählten Zustand eine neue Liste der Städte erzeugt

jetzt will ich bearbeitet Szenario machen, damit ich den Staat und die Stadt ausgewählt haben, aber ich möchte es den Anwendungsbereich der Richtlinie setzen

controller.js

if($scope.$$childHead && $scope.$$childHead.changeState){ 
    $scope.$$childHead.state=$rootScope.state; 
    $scope.$$childHead.changeState($rootScope.state) 
    $scope.$$childHead.city=$rootScope.city; 
    } 

directive.js

app.directive('w34UsAddress', function ($http,$rootScope) { 
return { 
    restrict: "A", 
    scope: { 
     state: '=', 
     city: '=', 
     changeState:'&' 
    }, 
    templateUrl:'templates/usAddress.html' , 
    link: function (scope,elem, attr) { 
      scope.states = [ 
       { 
        id: "AL", 
        name: "Alabama" 
       }, 
       { 
        id: "AK", 
        name: "Alaska" 
       }, 
       { 
        id: "AS", 
        name: "American Samoa" 
       }, 
       { 
        id: "AZ", 
        name: "Arizona" 
       }, 
       { 
        id: "AR", 
        name: "Arkansas" 
       }, 
       { 
        id: "CA", 
        name: "California" 
       }, 
       { 
        id: "CO", 
        name: "Colorado" 
       } 
] 


    scope.changeState = function (stateIndex) { 


     $http({ 
      method:'GET', 
      url:'cities.json', 
      dataType:'jsonp' 
     }).success(function (cities) { 

     scope.cities = cities[stateIndex]; 

     $rootScope.loading = false; 


     }) 

      } 
     } 
} 
    }) 

wenn ich console.log($scope.$$schildHead) versuchen, es gibt null zurück

aber wenn es console.log($scope) Ich fand in ihm $$schildHead werden und die Eigenschaften ich brauche,

Könnte jemand Hilf dabei. Danke im Voraus!

Antwort

1

Doppel-Dollar $$ Dinge sind in Angular intern und sollten nicht in der Produktion verwendet werden, wenn möglich (d. H. Fast immer).

Der Grund, warum $scope.$$childHeadnull sein kann (und einer der zahlreichen Gründe, warum es nicht für alles außer dem Testen und dem Hacken verwendet werden sollte), ist die Art, wie Winkelumfang und Zusammenstellung funktionieren. Es gibt $scope.$parent, aber keine $scope.$children. Das liegt daran, dass die Scope-Hierarchie in einer überraschend hierarchischen Weise aufgebaut ist.

Controller und Pre-Linking-Funktionen werden von Eltern zu Kindern ausgeführt. Ein Controller ist der früheste Punkt, an dem man den Umfang der Richtlinie erreichen kann. Die Kinder und ihre Bereiche sind einfach noch nicht da.

Post-Linking (link) Funktionen werden von Kindern an die Eltern ausgeführt. Wenn es einen Ort geben würde, an dem ein Elternteil sicher sein kann, dass die Kinder und ihre Bereiche bereit sind (ausgenommen die Fälle, in denen zusätzlich $timeout involviert sein muss), dann ist dies der erste.

Die Notwendigkeit, $scope.$$childHead in einer Direktive zu verwenden, zeigt an, dass einige schlechte Design-Entscheidungen stattgefunden haben.

  • Zwei-Wege-= Bindungen in den Kindern Richtlinien
  • Kontext & Bindungen in den Kindern Richtlinien
  • require d geordneten Controllern in den Kindern Richtlinien
  • : Die Richtlinie sollte die empfohlenen Wege der Richtlinie Kommunikation durch die Verwendung Refactoring
  • Ereignis $emit/$broadcast (nicht empfohlen für isolierte Bereiche wegen einer defekten Bereichshierarchie)