2013-04-11 119 views
0

我想在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' 
    } 
} 
});    

回答

3

那是因爲你有一個隔離的範圍指令試試這個:

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

,將工作。
希望這有助於。

+0

這太棒了。萬分感謝。 :) – bingjie2680 2013-04-11 09:18:00

7

雖然@葉海亞的答案會工作,而不是使用$parent,它可以打破,如果你的HTML結構的變化(即HTML的變化可以改變範圍是如何繼承),就應該在一個HTML屬性,它的方法/回調您指定想讓你的指令被點擊的元素時,調用:

<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

+0

這確實是一個更好的方法。我實際上正在嘗試這種方法,但由於我沒有調用測試(),所以無法正常工作,無論如何由於我接受了答案而投票。感謝分享。 – bingjie2680 2013-04-11 19:09:30

+0

這應該是正確的答案。基本上任何時候馬克都會迴應一些事情,他是對的。不要爭辯,只要同意並繼續前進。 :) – 2013-05-30 20:02:54