2015-01-14 18 views
9

Hãy nói rằng tôi có đoạn mã saumột chỉ thị thể xóa chính nó từ một phạm vi mẹ

<div ng-app="app" ng-controller="controller"> 
<div ng-repeat="instance in instances> 
    <customDirective ng-model="instance"></customDirective> 
</div> 
</div> 

Và chỉ thị tùy chỉnh của tôi có một phạm vi cô lập, định nghĩa là:

app.directive('customDirective', function($log) { 
     return { 
      restrict: 'E', 
      templateUrl: './template.htm', 
      scope: {_instance:"=ngModel"}, 
      link: function($scope) { 
      .... 
      } 
     }); 

Trong chỉ thị này, tôi có tùy chọn để xóa nó. Câu hỏi của tôi là làm thế nào tôi có thể giao tiếp trở lại các trường hợp mảng trong phạm vi cha mẹ và nói với nó để tiêu diệt đối tượng này và có hiệu lực loại bỏ các trường hợp đã xóa từ DOM của tôi?

Hy vọng điều đó có ý nghĩa.

+0

có vẻ như bạn đang nhìn vào nó ngược ... loại bỏ các đối tượng dụ từ mảng mô hình, góc mất chăm sóc DOM cho bạn – charlietfl

+0

@Matt, bạn có thể cân nhắc việc di chuyển dấu kiểm của mình sang câu trả lời khác. Có vẻ như sự đồng thuận chung là cách tiếp cận được ưa thích. –

Trả lời

30

theo New Dev trong một previous comment, đây là cách:

var app = angular.module('app', []) 
 
    .directive('customDirective', function($log) { 
 
    return { 
 
     restrict: 'EA', 
 
     template: '<a href="" ng-click="onRemove()">remove me {{model.n}}</a>', 
 
     scope: { 
 
      model:"=", 
 
      onRemove:"&" 
 
     } 
 
    } 
 
    }) 
 
    .run(function($rootScope) { 
 
    $rootScope.instances = [{n:1},{n:2},{n:3},{n:4}]; 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app"> 
 
    <div ng-repeat="i in instances"> 
 
    <custom-directive model="i" on-remove="instances.splice($index,1)"> 
 
    </custom-directive> 
 
    </div> 
 
</div>

+1

hoàn hảo. Smooth như không có câu trả lời khác tôi đã nhìn thấy xung quanh! cảm ơn! – Dazag

+0

Giải pháp tuyệt vời –

3

Trước tiên, không sử dụng ngModel làm thuộc tính DOM. Đây là một chỉ thị AngularJS được sử dụng để liên kết các đầu vào biểu mẫu với các biến phạm vi.

Tôi đã đổi tên thành model và thêm thuộc tính bổ sung được gọi là index.

<div ng-app="app" ng-controller="controller"> 
    <div ng-repeat="instance in instances> 
    <customDirective model="instance" index="$index"></customDirective> 
    </div> 
</div> 

Bây giờ trong điều khiển của bạn, bạn có thể nghe cho các sự kiện (chẳng hạn như một sự kiện tùy chỉnh bạn có thể tiêu đề removeCustom) phát ra bởi trẻ em sử dụng $scope.$on().

app.controller('controller',function($scope) { 
    $scope.instances = [.....]; 
    $scope.$on('removeCustom',function($index) { 
     delete $scope.instances[$index]; 
    }); 
}); 

Sau đó, trong chỉ thị tùy chỉnh của bạn, bạn phải sử dụng $scope.$emit() để phát sóng removeCustom bạn sự kiện lên hệ thống phân cấp phạm vi để điều khiển.

app.directive('customDirective', function($log) { 
    return { 
     restrict: 'E', 
     templateUrl: './template.htm', 
     scope: { 
      model:"=", 
      index:"=" 
     }, 
     link: function($scope,$el,$attr) { 
      // when you need to remove this 
      $scope.$emit('removeCustom',$scope.index); 
     } 
    }); 

FYI: Một chỉ thị luôn có thể loại bỏ tự bằng cách gọi $el.remove() trong hàm liên kết, nhưng kể từ khi chỉ thị của bạn được tạo ra thông qua một ngRepeat nó sẽ chỉ được tái tạo trong tiêu hóa tiếp theo. Vì vậy, bạn phải nói với bộ điều khiển để loại bỏ nó khỏi mảng instances.

+5

'$ emit' có vẻ không phù hợp ở đây vì nó" gây ô nhiễm "phạm vi toàn cầu. Tôi sẽ sử dụng '" & "' - một cuộc gọi hàm từ chỉ thị. –

+0

@NewDev vâng, tôi đồng ý. Đó sẽ là một cách tiếp cận tốt hơn. – cgTag

+6

không sử dụng 'xóa' trên mảng hoặc, nó không loại bỏ phần tử, sử dụng' splice() 'để bạn sửa đổi độ dài và không để lại một phần tử không xác định trong mảng. Nói chung là tốt hơn để vượt qua đối tượng thực tế và không dựa vào chỉ mục xem của nó, điều này có thể khác do lọc, sau đó sử dụng 'indexOf' để xóa nó – charlietfl

Các vấn đề liên quan