2015-07-21 36 views
0

我試圖製作一個元素,在點擊它時顯示它的內容: 有很多方法可以做到這一點。我想在指令裏面做。 爲什麼它不起作用?爲什麼我不能在AngularJS中使用ng-show內部指令?

http://plnkr.co/edit/Y13bcD7Ikuk6pERM9Mm8?p=preview

HTML:

<ez-option title="option 1"> 
     Option 1 inside 
     <input ng-model="x">{{x}} 
    </ez-option> 
    <ez-option title="option 2"> 
     Option 2 inside 
    </ez-option> 

的JavaScript:

directive('ezOption',function(){ 
    return { 
     template:'<li></li><div ng-show=selected ng-transclude class=body></div>', 
     link:function ($scope,iElement,iAttrs,controller,tanscludeFn){ 
      iElement.find('li').html(iAttrs.title) 
      iElement.find('li').on('click',function(){ 
       $scope.selected=true 
      }) 
     }, 
     scope:true, 
     transclude:true 
    } 
}) 

回答

1

由於您的活動角之外......這是一個DOM事件,您需要告訴角度有關範圍的變化,以便它可以運行摘要。

使用$scope.$apply()。如果您使用像ng-click這樣的核心事件指令,則這是通過角度內部完成的。

iElement.find('li').on('click',function(){ 
     $scope.selected=true; 
     $scope.$apply(); 
    }); 

因此,你通常最好使用核心角事件指令的衆多訴諸自己

DEMO

+0

三江源之前。 $ on可以提供幫助嗎? – Aminadav

+0

不....你需要告訴角度運行一個摘要,這不是什麼美元是 – charlietfl

2

這是因爲角度不知道從您的單擊事件的範圍變化。爲了讓它知道,你應該這樣做

  iElement.find('li').on('click',function(){ 
       $scope.$apply(function() { 
       $scope.selected=true; 
       }) 
      }) 

另外,也可以使用角度的ng-click代替

m.directive('ezOption',function(){ 
    return { 
     template:'<li ng-click="selected=true"></li><div ng-show=selected ng-transclude class=body></div>', 
     link:function ($scope,iElement,iAttrs,controller,tanscludeFn){ 
      iElement.find('li').html(iAttrs.title); 
     }, 
     controller:function($scope){ 
      $scope.selected=false 
     }, 
     transclude:true 
    } 
}) 
相關問題