У меня есть директива (показать youtube video), которая должна использовать функцию как атрибут, чтобы иметь возможность запускать ее внутри функции ссылки.Передайте функцию директиве, а затем вызовите ее с параметрами
Внутри HTML я написал (в нефрите)
div(ng-controller="videoPageCtrl")
...
div(my-youtube,id='aaa',url='KEHxHr-Ih9w',on-change="doEventsOnChange")
Мой контроллер и директивы выглядеть следующим образом
app
.directive('myYoutube', function($sce, $timeout) {
return {
restrict: 'A',
scope: {
url: '@',
id: '@',
onChange: '&',
},
link: function(scope) {
$timeout(function() {
scope.player = new YT.Player(scope.id, {
videoId: scope.url,
events: {
'onStateChange': function(state) {
console.log('state changed to', state, scope.id, scope.onChange);
scope.onChange(state, scope.id);
}
}
});
}, 5000);
}
};
})
.controller('videoPageCtrl', ['$scope', '$http', '$sce', function($scope, $http, $sce) {
$scope.doEventsOnChange = function(state, id) {
console.log(id, state, 'launched from controller!');
};
}]);
Проблема заключается в том, что я не могу передать id
и state
и запустить функцию doEventsOnChange
, В результате в консоли хром-детектора я могу видеть только линии state changed to
, но нет launched from controller!
строк с переданными id
и state
.
Что я делаю неправильно?
Итак, если бы у меня был шаблон в моей директиве, я должен был использовать '&'? – kaytrance
Если у вас есть шаблон в вашей директиве, и вы хотите называть его, давайте скажем ng-click, да. Если вы просто хотите использовать его в контроллере директивы, используйте '=' –
@MartijnWelker. Создав изолированную область действия для этой директивы, область не будет одинаковой. Таким образом, директива и контроллер не используют одну и ту же область. Используя «=», вы просто привязываете функцию (модель) родительской области к модели дочернего объекта :). Это будет работать, конечно, но я думаю, и было бы более уместным.И это потому, что двухсторонняя привязка к функции, которая никогда не изменится (внутри контроллера или директивы), не очень уместна. Использование & ссылки на функцию - лучший вариант. – AhsanAyaz