我正在尝试在Angular中创建一个自定义复选框指令,我已设法这样做了。但问题是没有调用内置ng-click
。如果删除了自定义指令,ng-click
效果很好。我想这与Scope有关,我仍然缺乏知识。请有人帮帮我。
代码在这里http://jsfiddle.net/bingjie2680/UzM2c/2/。
<div ng-app="components">
<div ng-controller="MainCtrl">
<input type="checkbox" ng-model="p.checked" />
<div checkbox="p.checked" ng-click="test()">test</div>
{{p.checked}}
</div>
</div>
JS:
function MainCtrl($scope){
$scope.p = {checked: false, name:'test'};
$scope.$watch('p', function(){
}, true);
$scope.test = function(){
alert('test');
}
}
angular.module('components', []).
directive('checkbox', function () {
return {
link : function (scope, ele, attr){
ele.bind('click', function(){
ele.toggleClass('active');
scope.$apply(function(){
scope.value = ele.hasClass('active');
});
});
scope.$watch('value', function(newv, oldv){
newv ? ele.addClass('active') : ele.removeClass('active');
});
},
scope : {
value: '=checkbox'
}
}
});
答案 0 :(得分:8)
虽然@Yahya的答案可行,但不是使用$parent
,如果HTML结构发生变化(即HTML更改可能会改变范围的继承方式),则可能会中断,您应该在HTML属性中指定哪种方法/ callback你希望你的指令在单击元素时调用:
<div checkbox="p.checked" cb="test()">test</div>
然后在你的指令中:
ele.bind('click', function(){
ele.toggleClass('active');
scope.cb(); // calls test()
scope.$apply(function(){
scope.value = ele.hasClass('active');
});
});
...
scope : {
value: '=checkbox',
cb: '&',
}
答案 1 :(得分:3)
那是因为你有一个带有隔离范围的指令试试这个:
<div checkbox="p.checked" ng-click="$parent.test()">test</div>
那会有用。
希望这有帮助。