2014-01-29 3 views
0

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

<div ng-controller="Parent"> 
    <div ng-include="child1"></div> 
    <div ng-include="child2"></div> 
    ... and so on, the parent decides which templates to include on the fly 
</div> 

<script type="text/ng-template" id="Child.html"> 
    <div ng-controller="Child">...</div> 
</script> 

function Parent($scope) { 
    $scope.child1 = "Child.html"; 
    $scope.child2 = "Child.html"; 

    // The problem is setting these 
    $scope.childId1 = 1; 
    $scope.childId2 = 2; 

    $scope.on($scope.childId1 + ".someEvent", function() { 
    // Handle event from child 1 
    }); 
    $scope.on($scope.childId2 + ".someEvent", function() { 
    // Handle event from child 2 
    }); 
} 

function Child($scope) { 
    $scope.id = getNewId(); 

    // Here I would like to do something like 
    $parent[someKey] = $scope.id; 

    // So that I can emit events like this 
    $scope.someEvent = function() { 
    $scope.$emit($scope.id + ".someEvent", data); 
    } 
} 

Поэтому я думаю, что проблема состоит из двух частей.

1.) Как передать someKey из родительского элемента в дочерний.

2.) Как установить someKey в родительскую область внутри дочернего элемента. Хотелось бы избежать использования $ parent. Даже не уверен, доступна ли эта переменная в контроллере?

ответ

1

Использования сообщений для передачи идентификатора, который вы хотите использовать

Я бы переключить «$ на» сообщениях в ваших родителях, чтобы выглядеть следующим образом:

$scope.on(".someEvent", function(event,data,id) { 
    switch(id) { 
     case 1: 
      // Handle event from child 1 
     case 2: 
      // Handle event from child 2 
    } 

    }); 

И ваши испускают сообщения выглядеть это:

$scope.someEvent = function() { 
    $scope.$emit(".someEvent", data, $scope.id); 
    } 
+0

Мой родитель не знает ребенка идентификатор. Я хочу дать каждому контроллеру уникальный идентификатор, обратившись к службе. – mozey

+0

Мое решение находится в следующей скрипте: http://jsfiddle.net/lesouthern/5DZGv/ Просьба уточнить, если это не то, что вы описываете – koolunix

+0

Проблема с этим решением заключается в том, что $ rootScope. $ On ('childEvent 'является обработчиком catch catch. Я хочу иметь возможность регистрировать обработчик, который прослушивает только определенный ребенок. – mozey

0

Мне удалось решить мою проблему, создав директиву loadController. Эта директива устанавливает родительский ключ для дочернего элемента, и это позволяет мне создавать обработчики для событий только из определенного дочернего экземпляра. В моем вопросе я попытался установить дочерний идентификатор родителя. Я закончил делать это наоборот, то есть сделать родительский набор идентификатором для ребенка. Так в родительском я бы

$scope.$on($scope.id + ".child1.click", function(event, data) { 
    $scope.messages.push(data); 
}); 

Если строка «child1» является то, что родитель хочет, чтобы сделать это. А в детстве я излучала бы как этот

$scope.$emit($scope.key + ".click", data); 

Обратите внимание, что

$scope.id + ".child1" == $scope.key 

Для полного примера см это http://plnkr.co/edit/2CdzQSKgWODIRvL5OZ9O

Смежные вопросы