Перетащите директиву/компонент Angular 1.x и родительскую область

Допустим, переменная области видимости моего родительского компонента/директивы объявлена ​​следующим образом: $scope.g = { // methods here };

В каждом из контроллеров моего вложенного компонента/директивы я ссылаюсь на эту переменную, например $scope.$parent.$parent.g, а затем вызываю некоторую функцию из g, например $scope.fromNgClick = function() { $scope.$parent.$parent.g.run(); };. Это прекрасно работает (хотя мне бы хотелось, чтобы у предков был более удобный способ обращения к псевдониму? Вместо цепочки $parent).

Когда я естественным образом перетаскиваю компонент из его родительского компонента в другой родительский родственный компонент (понятно?), тот же $scope.fromNgClick = function() { $scope.$parent.$parent.g.run(); }; по-прежнему указывает на исходную область, а не на новую, как мне нужно. Таким образом, щелчок по тому же элементу ng-clickable по-прежнему вызывает метод run() в области действия предыдущего дедушки и бабушки.

Все это имеет смысл; но есть ли способ заставить область вместо этого указывать на область прародителя новых отброшенных местоположений?

Спасибо!

ИЗМЕНИТЬ
Разметка будет выглядеть примерно так, как показано ниже, где <g-directive> рассматривается как дедушка и бабушка, потому что он использует transclude в своем шаблоне, в конечном итоге обертывая дочерние директивы:

<g-directive>
    <child-directive></child-directive>
    <another-child-directive></another-child-directive>
    <yet-another-child-directive></yet-another-child-directive>
</g-directive>
<g-directive>
    <c-child-directive></c-child-directive>
    <c-another-child-directive></c-another-child-directive>
    <c-yet-another-child-directive></c-yet-another-child-directive>
</g-directive>

Это причина $scope.$parent.$parent.g в дочерних директивах/компонентах.

Дочерний компонент можно перетащить, а затем поместить в другой <g-directive>, но его контроллер по-прежнему указывает на своего исходного прародителя (исходная переменная области контроллера <g-directive>). Я хочу, чтобы он указывал на новый прародитель, в который был добавлен, по сути, сбрасывая его область действия до вновь размещенной области.


person bit-less    schedule 07.07.2016    source источник
comment
если вы хотите взглянуть на это: stackoverflow.com/questions/11252780/ Не уверен, почему вам нужно вызывать так много родителей из вашей текущей области.   -  person batmaniac7    schedule 07.07.2016
comment
@maddog Я думаю, что это полезно для некоторых других ситуаций, но я не знаю, как это разрешит ссылку области дочернего элемента на нового дедушку и бабушку.   -  person bit-less    schedule 07.07.2016
comment
вы можете emit и broadcast вызывать другие контроллеры. и используйте службу обмена или переменную $rootScope для обмена данными.   -  person batmaniac7    schedule 07.07.2016
comment
@maddog В этом случае, однако, даже с генерацией псевдособытий для вызова методов, как мне отличить, какую ‹g-директиву› нужно вызывать, если все экземпляры ‹g-директивы› наблюдают за одним и тем же событием? Все они динамические. У меня может быть любое количество ‹g-directive› с любым количеством вложенных директив/компонентов, и этим вложенным компонентам нужно только когда-либо запускать метод current ‹g-directive› для любого из них. они были перемещены/вставлены в этот момент. Даже передача данных не позволит мне узнать, какой родитель является текущим, поскольку они могут начинаться где угодно. :/   -  person bit-less    schedule 08.07.2016
comment
Я думаю, это может решить вашу проблему (scope.emit): stackoverflow.com/questions/26752030/   -  person batmaniac7    schedule 08.07.2016
comment
также вы можете присвоить номера из вашего кода конкретным родителям/ребенку   -  person batmaniac7    schedule 08.07.2016
comment
@maddog Это была действительно хорошая статья, и в целом она работает очень хорошо, но даже при использовании этого метода указатели все еще находятся в исходной области, в которой находился дочерний компонент.   -  person bit-less    schedule 08.07.2016
comment
Давайте продолжим обсуждение в чате.   -  person bit-less    schedule 08.07.2016


Ответы (1)


<g-directive some-attr=1>
 <child-directive></child-directive some-attr=1>
 <another-child-directive></another-child-directive some-attr=1>
 <yet-another-child-directive></yet-another-child-directive some-attr=1>
</g-directive>

<g-directive some-attr=2>
 <child-directive></child-directive some-attr=2>
 <another-child-directive></another-child-directive some-attr=2>
 <yet-another-child-directive></yet-another-child-directive some-attr=2>
</g-directive>

У каждого может быть свой слушатель для broadcast и emit.

если директивы повторяются через ng-repeat, то $index может быть этим атрибутом. Надеюсь это поможет.

person batmaniac7    schedule 07.07.2016
comment
Спасибо за вчерашние подробности. Вместо того, чтобы делать эту работу, мне удалось изменить структуру компонента-оболочки, чтобы реализовать некоторые функции, которые я изначально назначил вложенным компонентам, и это работало нормально для моего варианта использования. - person bit-less; 09.07.2016