Когда мне требуется контроллер в директиве, я получаю сообщение об ошибке, говорящее, что не могу найти контроллер. См. код с проблемой ниже. http://plnkr.co/edit/NzmQPA?p=preview
Может кто-нибудь посмотреть на это?
Спасибо
Когда мне требуется контроллер в директиве, я получаю сообщение об ошибке, говорящее, что не могу найти контроллер. См. код с проблемой ниже. http://plnkr.co/edit/NzmQPA?p=preview
Может кто-нибудь посмотреть на это?
Спасибо
Вы должны использовать службу для связи между ними. То, как и что вы делаете, зависит от ваших конкретных потребностей (в вашем посте недостаточно информации).
Примечание: я изменил ваш обработчик кликов на 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');
};
});
Вы должны использовать 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.
});
}
};
}
);
Любые области, заинтересованные в событии, могут подписаться на него с помощью $on:
function($scope) {
$scope.$on("someEvent", function() {
alert('this is working');
});
}
Использование событий позволяет создавать несвязанные системы.
shared
свойства между областями => когда другая область изменяет эти shared
свойства, все остальные области замечают изменения. В других случаях мы используем события. Я не думаю, что angular не предлагает использовать трансляцию или излучать слишком много, это должно зависеть от контекста.
- person Khanh TO; 23.02.2014
do not have to directly depend
накладываете компоненты на другие компоненты.
- person Khanh TO; 04.03.2014