2013-03-19 53 views
1

事件,我创建了围绕创建使用ngTransclude一些内容的DIV-包装一个指令。看到这个很简单的例子:http://jsfiddle.net/DHzrr/1/angular.js指令燕子从transclude

如果从HTML

<div ng-controller="TodoCtrl"> 
    <form ng-submit="addTodo()"> 
    <input type="checkbox" ng-model="checked"> 
    </form> 
    <div ng-hide="checked">NOT CHECKED</div> 
</div> 

的“NG隐藏”监听器正在删除该组元素。因此,我的组指令会吞噬事件,从而释放或隔离$ scope。我该如何做这项工作?

我想使用的范围时,一个新的范围只创建:真实属性的指令定义对象。

回答

2

transclude: true创建一个新的子作用域prototypically从父(TodoCtrl)范围继承。您可以通过三种方式解决问题:

  1. (推荐)结合父范围定义的对象属性:ng-model="obj.checked",并在你的控制器:$scope.obj = {checked: false}
    fiddle
  2. 使用ng-model="$parent.checked"
  3. 使用函数,在父更新模型:添加ng-change="toggle()"input,那么你的控制器上定义一个函数:$scope.toggle = function() { $scope.checked = !$scope.checked }

看到一个“What are the nuances of scope prototypal/prototypical inheritance in AngularJS?”第号指令项目“4。 transclude: true

+0

感谢您的。现在,我发现关于这个话题,你出色的解释中所有其他线程。我想我现在明白了怎么回事,但我不是100%幸运的,因为理想,我不想改变控制器也不模型和指令应该只添加“布局包装”。接缝并不容易,因为我以为。 – chrise 2013-03-20 09:00:02

+1

@chrise,“最佳实践”(根据[MISKO(http://www.youtube.com/watch?v= ZhfUv0spHCY及功能= youtu.be&T = 30米))是使用在$范围引用您的车型。所以,你得到太远沿着你的架构前,你可能要重新审视,那么它应该是更容易为你的指令添加版面包装 – 2013-03-20 14:27:12

+0

没错。感谢Mark的帮助。 – chrise 2013-03-20 19:14:10