范围子头/尾为空

时间:2016-03-20 18:18:24

标签: angularjs angularjs-directive angularjs-scope

我正在使用AngularJs应用程序,我正在使用指令和控制器

指令负责获取状态列表,并在选择状态下生成新的城市列表

现在我想制作一个编辑场景,所以我选择了州和城市,但我想将其设置为指令的范围

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;


        })

            }
        }
}
    })

当我尝试console.log($scope.$$schildHead)时,它返回null

但当它成为console.log($scope)时,我在其中找到$$schildHead并拥有我需要的属性,

任何人都可以提供帮助。提前谢谢!

1 个答案:

答案 0 :(得分:1)

Double-dollar $$内容在Angular中是内部的,如果可能的话,不应该在生产中使用(即几乎总是)。

$scope.$$childHead可以null的原因(以及为什么它不应该用于除测试和黑客之外的所有内容的众多原因之一)是Angular范围和编译工作的方式。有$scope.$parent但没有$scope.$children。这是因为范围层次结构以令人惊讶的分层方式构建。

控制器和预链接功能从父母到子女执行。控制器是最早可以获得指令范围的人。孩子们和他们的范围还没有。

从子项到父项执行后连接(link)函数。如果父母可以确定孩子及其范围已准备就绪(除了必须涉及额外$timeout的情况除外)他们的第一个摘要周期,那就是那个。

在指令中使用$scope.$$childHead的需要表明发生了一些糟糕的设计决策。应该重构该指令,以便通过以下方式使用推荐的指令通信方式:

  • 子指令中的双向=绑定
  • 子指令中的上下文&绑定
  • require子指令中的父控制器
  • 事件$emit / $broadcast(由于范围层次结构破坏,不推荐用于隔离范围)