Порядок загрузки контроллера отличается при загрузке или навигации

Таким образом, структура моего контроллера может быть виновата в этом. Здесь вы можете увидеть родительский и 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', {});

Идея состоит в том, что мне нужно получить events от родительского объекта person до дочернего контроллера. Проблема в том, что каждый метод повышения setAssociations от родителя работает только в одном контексте.

Версия load работает, если страница перемещается из приложения (хеш, навигация). Однако при перезагрузке или навигации извне (полная загрузка) дочернее событие никогда не возникает, по-видимому, потому, что оно еще не зарегистрировало его слушателей.

Версия event работает, если страница обновляется или перемещается извне приложения (все, что вызывает загрузку страницы). При навигации, $scope пуст, хотя и этот метод терпит неудачу.

Таким образом, порядок, в котором приложение загружает контроллеры, отличается при "глубокой увязке" или освежении, а также при внутренней навигации. Как я могу получить согласованное поведение нагрузки от контроллеров angular, у которых есть родительское дочерние отношения?

Ответ 1

Рассматривая проблему с другой точки зрения, поскольку дочерние области прототипно наследуются от родительских областей, это означает, что любые свойства, которые мы определяем в родительской области, сразу доступны в области дочерних объектов... даже если вы добавляете свойства родительскому объекту позже, после создания детской области. Другими словами, вам может не понадобиться использовать событие, чтобы получить информацию, которую вы хотите для ребенка.

Если ваша проблема заключается в том, что для области содержимого требуется некоторая информация из родительской области, просто назначьте эти данные новому свойству родительского объекта $scope и получите доступ к вашему ребенку. Когда он будет определен, он появится в дочернем представлении. Вместо var associations попробуйте $scope.associations.

Вот надуманная скрипка, которая использует ng-click для добавления некоторых данных в родительскую область, которая затем становится видимой в дочернем представлении.

Помогает ли это решить вашу проблему?