2014-10-12 7 views
3

Я пытаюсь связать две вложенные директивы, которые используют изолированные области.Как связать вложенные директивы, которые используют изолированные области в angularjs

<div ng-controller="myController"> 
    <my-dir on-done="done()"> 
     <my-dir2 on-done="done()"> 
     </my-dir2> 
    </my-dir> 
</div> 

Я хотел бы вторую директиву (мой-dir2) для вызова функции сделали() первой директивы (мой-дир), который в свою очередь, назвал бы один контроллер.

К сожалению, я не знаю, как заставить вторую директиву обращаться к обратному вызову первой директивы (до сих пор вторая директива просматривает контроллер высокого уровня, минуя первую директиву).

Я думаю, что можно использовать «require», но я не могу, поскольку эти две директивы не связаны (я хочу использовать my-dir2 внутри других директив не только my-dir).

Чтобы было ясно: я не хочу использовать запрос, потому что это означает, что на myDir2 будет установлена ​​зависимость myDir. Я хочу сказать: я хочу иметь возможность повторно использовать myDir2 внутри других директив. Поэтому я не хочу, чтобы myDir2 был основан на myDir, но я хочу сообщить верхнюю директиву (myDir), когда что-то сделано (например, в обратном вызове в js).

Я сделал plunker: как вы можете видеть в консоли javascript, my-dir2 вызывает непосредственно функцию done из контроллера высокого уровня.

У кого-нибудь есть чистый способ справиться с такой ситуацией?

Благодаря

ответ

0

Update:

быть способными директивами записи, которые не зависят друг от друга, вам нужно использовать событие:

  1. использования $emit('myEvent', 'myData') огнь события, которое будет обрабатываться по областям, которые вверх в иерархии.
  2. использовать $broadcast('myEvent', 'myData'), чтобы запустить событие, которое будет обрабатываться областями, расположенными вниз в иерархии.
  3. обрабатывать событие, которое было запускаемое $emit или $broadcast использования $on('myEvent', function(event, data){\\your code})

P.S.: В вашем случае $emit не будет работать, так как директивы прицелы находятся на том же уровне в иерархии, так что вам нужно будет использовать $rootScope.$broadcast('myEvent' \*, myData*\); Я обновил свой plunker, чтобы отразить необходимые изменения http://plnkr.co/edit/eTkO6sk6hpuYPnCjlSKn?p=info

Ниже будет сделать внутренняя директива зависит от внешней директивы:

в основном, чтобы иметь возможность вызвать функцию в первой директиве вам нужно сделать некоторые изменения:

  1. добавить require = '^myDir' к myDir2
  2. удалить onDone из myDir2 и держать изолированный прицел scope:{}
  3. параметра добавить контроллер связать функцию в myDir2link: function(scope,element,attrs,controller)
  4. в myDir1 контроллере изменить определение done функции от $scope.done к this.done
  5. вызова controller.done() в myDir2

вот plunker с необходимыми изменениями http://plnkr.co/edit/eTkO6sk6hpuYPnCjlSKn

+0

Спасибо за вашу помощь, к сожалению, как я уже сказал, я не хочу использовать запрос, потому что это означает, что будет моя зависимость от myDir на myDir2. Я хочу сказать: я хочу иметь возможность повторно использовать myDir2 внутри других директив. Поэтому я не хочу, чтобы myDir2 основывался на myDir, но я хочу сообщить верхнюю директиву, когда что-то сделано. – nlko

+1

@nlko вы можете использовать события как средство коммуникации между директивами, проверить этот ответ http://stackoverflow.com/a/14502755/158421 он объясняет концепцию в контроллерах, которые также могут применяться к директивам –

+0

Спасибо Мохаммад за указание на меня это. Я думаю, что третье решение (излучение события от ребенка к родительскому лицу, где родитель может свободно его поймать), похоже, соответствует моей потребности. Я даю вам точку (если вы предпочитаете создать новый ответ)! – nlko

0

Я думаю, что вы можете сделать что-то вроде этих:.. angular.element ('мой-Dir') контроллера ('Mydir') сделано();

Попробуйте!