加载或导航时控制器加载顺序不同

时间:2012-12-11 17:31:40

标签: javascript angularjs

因此我的控制器的结构可能是罪魁祸首。在这里,您可以看到parentchild控制器,但重要的部分在这里:

家长控制器

//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', {});

我的想法是,我需要从父级events对象获取person到子控制器。问题是,每个从父级提升setAssociations的方法只能在一个上下文中工作。

如果页面从应用程序(哈希,导航)导航到,则load版本可以正常工作。但是,当从外部重载或导航(满载)时,子事件永远不会被引发,大概是因为它还没有注册其监听器。

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

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

1 个答案:

答案 0 :(得分:5)

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

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

这是contrived fiddle,它使用ng-click将一些数据添加到父作用域,然后在子视图中显示。

这会解决您的问题吗?