2014-01-16 69 views
0

中使用內部元素時沒有註冊我有一個帶有絕對定位錨點的邊欄,點擊時應激活一個AngularJS指令來打開/關閉邊欄。ngClick在指令

當錨點位於aside元素之外時,此功能正常工作,但出於定位原因,我希望它在裏面。但是,在元素內部,我沒有看到任何證據表明點擊是處理過的。

<div class="page-wrap"> 
    <aside data-slide-toggle="smToggleSidebar" data-slide-toggle-duration="100"> 
    <a ng-click="smToggleSidebar=!smToggleSidebar">&lang;</a> 
    // content here 
    </aside> 
</div> 

該指令本質上是:

.directive('slideToggle', function() { 
    return { 
     restrict: 'A', 
     scope:{ 
     isOpen: "=slideToggle" 
     }, 
     link: function(scope, element, attr) { 
     var slideDuration = parseInt(attr.slideToggleDuration, 10) || 200; 
     scope.$watch('isOpen', function(newVal,oldVal){ 
      if(newVal !== oldVal){ 
      $(element).stop().slideToggle(slideDuration); 
      } 
     }); 
     } 
    }; 
    }) 

我的品牌新的角度,所以我敢肯定這件事情,我的誤解,有可能與範圍。

+0

哪裏是你的收盤標籤應該是什麼? – Chris

+0

您使用1.2版之前的Angular版本嗎? – KayakDave

+0

1.1.5 - 由於我試圖刪除額外的代碼,示例代碼中缺少'/ aside',它在內容之後的實際代碼中存在。 – helion3

回答

1

Angular指令創建它們自己的作用域,所以如果將錨標籤放在指令內,它將屬於指令的作用域,而不是父對象。爲了讓指令必須你必須將它添加到的範圍,以傳遞函數指令父功能的訪問:

scope:{ 
    isOpen: "=slideToggle", 
    onToggle: '&' 
    } 

,並管理您的指令內的NG-點擊。我建議是這樣的:

HTML

<div class="page-wrap"> 
    <aside on-toggle="onToggle()" data-slide-toggle="smToggleSidebar" data-slide-toggle-duration="100"> 
     <a ng-click="onToggle()">&lang;</a> 
     // content here 
    </aside> 
</div> 

指令

.directive('slideToggle', function() { 
return { 
    restrict: 'A', 
    scope:{ 
    isOpen: "=slideToggle", 
    onToggle: "&" 
    }, 
    link: function(scope, element, attr) { 
    var slideDuration = parseInt(attr.slideToggleDuration, 10) || 200; 
    scope.$watch('isOpen', function(newVal,oldVal){ 
     if(newVal !== oldVal){ 
     $(element).stop().slideToggle(slideDuration); 
     } 
    }); 
    } 
}; 

});

父控制器

$scope.onToggle = function(){ 
    $scope.smToggleSidebar =! $scope.smToggleSidebar; 
}; 
+0

謝謝,這解決了它。你能幫我理解'onToggle:「和」'做什麼嗎? – helion3

+1

請注意,這僅在版本1.2之前才爲真:[fix($ compile):make isolate scope truly isolate](https://github.com/angular/angular.js/commit/909cabd36d779598763cc358979ecd85bb40d4d7) – KayakDave

+0

很高興它的工作。有三種方法將數據綁定到指令,'='是一種雙向綁定(您在'= slideToggle'中使用它),'@'是一種方法(父對子)和'&',允許訪問父功能。你可以在角度指令文檔中瞭解更多關於它的信息http://docs.angularjs.org/guide/directive – ruedamanuel