添加自定义复选框指令(带隔离范围)后,角度内置指令不起作用

时间:2013-04-11 08:38:27

标签: javascript angularjs angularjs-scope

我正在尝试在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'
    }
}
});            

2 个答案:

答案 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: '&',
}

Fiddle

答案 1 :(得分:3)

那是因为你有一个带有隔离范围的指令试试这个:

<div checkbox="p.checked" ng-click="$parent.test()">test</div>

那会有用。
希望这有帮助。