我有一个指令(显示YouTube视频),它应该把一个函数作为一个属性,以便能够在链接函数中启动它。将一个函数传递给一个指令,然后用参数调用它
我(玉)
div(ng-controller="videoPageCtrl")
...
div(my-youtube,id='aaa',url='KEHxHr-Ih9w',on-change="doEventsOnChange")
我的控制和指导的样子写的HTML中如下
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
功能。 结果在chrome dev控制台中,我只能看到state changed to
行,但没有launched from controller!
行通过id
和state
。
我在做什么错?
因此,如果我的指令中有模板,我应该使用'&'? – kaytrance
如果您的指令中有一个模板,并且您想从中调用该模板,那么可以在这里指出一个ng-click,是的。如果您只是想在指令的控制器中使用它,请使用'=' –
@MartijnWelker ..通过为指令创建一个隔离范围,范围不一样。所以指令和控制器没有使用相同的范围。通过使用“=”,您只需将父作用域的函数(模型)绑定到子作用域的模型:)。它当然会起作用,但我认为并且会更合适。这是因为对于永远不会改变的函数(在控制器或指令中)的两种方式绑定不是很合适。使用和引用该函数是一个更好的选择。 – AhsanAyaz