关于 javascript:Angular: 在指令中查找父对象

Angular: find parent Objects inside directives

我遇到以下问题:

我想在应用程序的不同位置使用指令,并且不想在每次使用指令时都指定父对象和指令对象。

看看这个plnkr:
http://plnkr.co/edit/yUoXXZVJmoesIQNhoDDR?p=preview

它只是一个存储多级数组的 $scope.data 对象。

1
2
3
4
5
6
7
8
9
$scope.data=
[
  {"name":"LEVEL0_A","subitems":
  [
    {"name":"Level1_A","subitems":[{"name":"A"},{"name":"B"}]},
    {"name":"Level1_B","subitems":[{"name":"C"},{"name":"D"}]},
...
...
and so on

还有一个名为deleteItem 的小示例自定义指令,正是这样做的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.directive('deleteItem', function() {
 return {
   scope:{
     item:'=',
     parent:'='
         },
   template: '<ng-transclude></ng-transclude>Delete',
   transclude:true,
   controller: function($scope){
     $scope.deleteItem=function(currentItem,currentParent){
       currentParent.subitems.splice(currentParent.subitems.indexOf(currentItem),1);
   };
  }
 };
});

这里是html模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<body ng-app="myApp">
 
   
      {{level0.name}}
     
       
          {{level1.name}}
       
        --------------------
       
         
            Name: {{level2.name}}
         
       
       
     
   
 
</body>

我的意思是它可以工作,但实际上我觉得必须有某种方法可以找到项目和父项,而无需手动将它们专门链接到范围。

如果有人能指出我正确的方向,我会非常高兴。
谢谢
马库斯


如果你这样做。

1
2
3
 $scope.deleteItem=function(currentItem,currentParent){
   currentParent.subitems.splice(currentParent.subitems.indexOf(currentItem),1);
 };

然后您的指令将依赖于其范围之外的数据结构。这意味着该指令只有在完全遵循该模式时才能删除项目。如果您想对不是来自数组的数据使用删除按钮怎么办?

更好的方法是使用 API 特性 & 在外部作用域上执行表达式。

1
2
3
4
5
6
7
8
9
app.directive('deleteItem', function () {
    return {
        scope: {
            remove: '&deleteItem'
        },
        template: '<ng-transclude></ng-transclude>Delete',
        transclude: true
    };
});

当用户点击"删除"时,remove() API 被调用,模板处理如何删除该项目。

1
2
3
4
5
6
7
8
9
10
    {{level0.name}}

   
       
            {{level1.name}}
       
        --------------------
       
           
                Name: {{level2.name}}