【问题标题】:Controller load order differs when loading or navigating加载或导航时控制器加载顺序不同
【发布时间】:2012-11-29 07:27:25
【问题描述】:

所以我的控制器的结构可能要为此负责。在这里你可以看到parent 和child 控制器,但重要的部分在这里:

父控制器

//Load version
$scope.person = People.people.get({ id: $routeParams.id}, function(person) {
     var associations = {
         events: person.events || [],
         people: person.people || [],
         places: person.places || []
     };
     $scope.$broadcast('setAssociations', associations);
});
//Event version
$scope.$on('getAssociations', function(e, args) {
  var associations = {
    events: $scope.person.events || [],
    people: $scope.person.people || [],
    places: $scope.person.places || []
  };
  $scope.$broadcast('setAssociations', associations);
});

儿童控制器

$scope.$on('setAssociations', function(event, args) {
    $scope.parentEvents = args.events;
});

$scope.$emit('getAssociations', {});

我的想法是我需要从父级的person 对象中获取events 到子控制器。问题是,从父级提升setAssociations 的每种方法都只适用于一种上下文。

load 版本适用于从应用内导航到页面(哈希、导航)。但是,当从外部重新加载或导航(完全加载)时,永远不会引发子事件,可能是因为它尚未注册其侦听器。

event 版本在页面被刷新或从应用程序外部导航到(任何导致页面完全加载的情况)时有效。导航到时,$scope 为空,但此方法失败。

因此,在“深度链接”或刷新以及进行内部导航时,应用加载控制器的顺序是不同的。 如何从具有父子关系的角度控制器获得一致的加载行为?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    从不同的角度来看问题,因为子作用域的原型继承自父作用域,这意味着我们在父作用域上定义的任何属性都可以在子作用域中立即访问......即使您将属性添加到父作用域作用域稍后,在创建子作用域之后。换句话说,您可能不必使用事件来获取您想要给孩子的信息。

    如果您的问题只是子范围需要来自父范围的一些信息,只需将该数据分配给新的父 $scope 属性,并让您的子视图访问它。当它被定义时,它将出现在子视图中。试试$scope.associations,而不是var associations。

    这是一个contrived fiddle,它使用 ng-click 将一些数据添加到父范围,然后在子视图中变得可见。

    这能解决您的问题吗?

    【讨论】:

    • 是的,谢谢,这比我做的要好得多。我在角度教程或概述中的任何地方都没有看到这个!这么完美的技术,他们为什么不告诉你?
    • 好吧,我应该提到以这种方式共享数据并不是“最佳实践”,因为这种方式假定了特定的父子 DOM 结构。如果有一天你决定让孩子成为同伴而不是孩子,那么这种技术就会失败。首选技术是创建一个服务并让父控制器和子控制器注入该服务——函数 MyCtrl($scope, myService)——共享数据存储到服务中并从服务中访问。小提琴示例:jsfiddle.net/whnSs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多