2014-02-21 5 views
0

Когда мне требуется контроллер в директиве, я получаю сообщение об ошибке, не могу найти контроллер. Пожалуйста, ознакомьтесь с кодом, указанным ниже. http://plnkr.co/edit/NzmQPA?p=previewДиректива Angularjs требует не найти родительский директивный контроллер

Может кто-нибудь, пожалуйста, взгляните на него?

Thanks

+1

Требуется только контроллер, если у них есть отношения родитель-потомок. См. Обновленный plunk http://plnkr.co/edit/iLfc3a?p=preview –

+0

@KhanhTO: Спасибо за это. Итак, если мне нужна связь между двумя директивами для сиблинга, как я могу это сделать? – jintoppy

ответ

1

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

Боковое примечание. Я изменил обработчик кликов на ng-click.

Вот пример: http://plnkr.co/edit/I2TvvV?p=preview

<div search-result-filter></div> 
<div search-result-header ng-click="doClick()"></div> 

angular.module('mymodule', []) 
    .controller('mainCtrl', ['$scope', 
    function($scope) { 
     $scope.test = "main angular is working"; 
    } 
    ]).controller('searchResultFilterController', ['$scope', 'myService', 
    function($scope, myService) { 
     //do something with 'myService' 
    } 
    ]) 
    .directive('searchResultFilter', [ 
    function() { 
     return { 
     replace: true, 
     controller: 'searchResultFilterController', 
     template: '<h1>this is the first directive</h1>' 
     }; 
    } 
    ]) 
    .directive('searchResultHeader', ['myService', 
    function(myService) { 
     return { 
     replace: true, 
     template: '<button>clickme</button>', 
     link: function($scope, $elem, $attrs) { 
      $scope.doClick = function() { 
      myService.someFn(); 
      }; 
     } 
     }; 
    } 
    ]) 
    .service('myService', function() { 
     this.someFn = function() { 
     alert('this is working'); 
     }; 
    }); 
+0

Спасибо за ответ. Когда мы используем это, мы просто используем сервис как средний человек? Я хочу двухстороннюю связь между этими директивами. Итак, если нажать одну кнопку на директиве 1, некоторые действия должны произойти в директиве2 и наоборот. Итак, если мы используем сервис, как мы это делаем? – jintoppy

+0

Просто увидел ваш комментарий. Опять же, это зависит от того, что вы делаете. Скажем, вы хотите, чтобы директива1 (D1) изменила какое-то значение, которое получает директива2 (D2). Одним из примеров могло бы быть то, что D1 вызовет функцию в службе, чтобы изменить какое-то значение, тогда как D2 имеет $ watch, установленный в одном из свойств службы. Проверьте это сообщение в блоге об использовании трех вариантов $ watch. http://www.bennadel.com/blog/2566-Scope-watch-vs-watchCollection-In-AngularJS.htm Вы можете использовать тот же метод, чтобы функция D2 вызывала функцию, когда значение изменяется в сервисе. –

+0

Вот обновленный плункер с примером, использующим массив. http://plnkr.co/edit/I2TvvV –

1

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

Для связи между областями вы должны попробовать $ on, $ emit, $ broadcast. В вашем случае, вам нужно вводить rootScope в вашу директиву, и транслировать событие из rootScope:

.directive('searchResultHeader', 

    function($rootScope) { //inject rootScope 
     return { 
     replace: true, 
     template: '<button>clickme</button>', 
     link: function($scope, $elem, $attrs) { 
      $elem.on('click', function() { 
      $rootScope.$broadcast("someEvent"); //broadcast an event to all child scopes. 
      }); 
     } 
     }; 
    } 
); 

Есть областей заинтересованы в том случае, могут подписаться на него с помощью $ на:

function($scope) { 
     $scope.$on("someEvent", function() { 
      alert('this is working'); 
     }); 
    } 

Использование событий - способ создания развязанных систем.

DEMO

+1

Да. мы можем так использовать. Но, это хороший подход? Я думаю, угловатый не предполагает использовать трансляцию или слишком сильно испускать, верно? – jintoppy

+0

@jintoppy: Существует 2 решения этой проблемы: использование событий и использование сервисов. Это зависит от нашего приложения. Мы используем сервисы, когда у нас есть некоторые свойства «shared» между областями scope =>, когда другая область изменяет эти свойства «shared», и все остальные области уведомляют об изменениях. В других случаях мы используем события. Я не думаю, что угловой не предполагает использовать трансляцию или слишком сильно испускать, это должно зависеть от контекста. –

+0

@jintoppy: Если ваши директивы не имеют ничего общего. Я хотел бы использовать события для создания более развязанной системы. –

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