2013-01-03 39 views
33

Tôi đang cố gắng tìm cách tốt nhất để có được một vị trí chỉ mục trong một ngRepeat được sử dụng với một chỉ thị tùy chỉnh. Vấn đề tôi đang cố gắng giải quyết là đối với mỗi lần lặp của ngRepeat, tôi muốn tùy chọn biết tôi đang ở đâu trong vòng lặp để tôi có thể tạo một mẫu tùy chỉnh dựa trên vị trí chỉ mục đó.

Trừ khi có một cách tốt hơn để làm điều này, tôi đang cố gắng để làm chức năng này dựa trên tài liệu này từ các directives:

& hay & attr - cung cấp một cách để thực hiện một biểu thức trong bối cảnh của phạm vi gốc. Nếu không có tên attr nào được chỉ định thì tên thuộc tính được giả định giống với tên cục bộ. Đưa ra và định nghĩa widget của phạm vi: {localFn: '& myAttr'}, sau đó cô lập thuộc tính phạm vi localFn sẽ trỏ đến một hàm bao hàm cho biểu thức count = count + value. Thường thì nó là mong muốn để truyền dữ liệu từ phạm vi cô lập thông qua một biểu thức và phạm vi cha, điều này có thể được thực hiện bằng cách chuyển một bản đồ các tên biến và giá trị biến cục bộ vào trong trình bao bọc biểu thức fn. Ví dụ, nếu biểu thức tăng (số lượng) thì chúng ta có thể chỉ định giá trị số lượng bằng cách gọi localFn là localFn ({amount: 22}).

http://docs.angularjs.org/guide/directive

Tôi đang gặp một số khó khăn tìm hiểu chính xác những gì tuyên bố này là nói cho tôi. Vì vậy, những gì tôi đã cố gắng để làm được điều này ...

Đầu tiên chỉ thị ngRepeat được sử dụng cùng với chỉ thị của tôi trong "testTemplate":

<ul> 
    <li my-attr="test()" my-directive ng-repeat="value in values" class="span2"> 
    </li> 
</ul> 

Tiếp theo, chỉ thị của tôi định nghĩa:

angular.module('myModule', []) 
     .directive('myDirective', function() { 
      return { 
       replace : true, 
       transclude : true, 
       scope : { 
        test: '&myAttr' 
       }, 
       templateUrl: 'partials/myTemplate.html', 
       link : function(scope, element, attrs) { 
        alert(scope.count); 
       } 
      } 
     }); 

Cuối cùng, tôi đang cố gắng xác định chức năng "kiểm tra" trong bộ điều khiển cho mẫu cha, nơi chỉ thị đang được tham chiếu.

function TestTemplateCtrl($scope, testTemplate) { 
    $scope.test = function() { 
     alert('in test'); 
     $scope.count = "1"; 
    } 
} 

Vì vậy, vấn đề đầu tiên là chức năng "thử nghiệm" của tôi ở cấp độ gốc không được thực thi. Có lẽ tôi không hiểu làm thế nào các chức năng kiểm tra trong bộ điều khiển cha mẹ nên được gọi. Bây giờ tôi không thực sự tăng được, hoặc là, nhưng là ở trên đúng cách tôi sẽ đi về tăng số của tôi khi tôi nhận được đến thời điểm đó nếu tôi có thể nhận được chức năng kiểm tra để bắn?

+1

Wow Tôi nghĩ rằng tôi đã làm cho điều này phức tạp hơn sau đó cần thiết. Tôi chỉ có thể lấy chỉ mục trong hàm liên kết của tôi với phạm vi. $ Parent. $ Index.Tôi vẫn muốn biết tại sao chức năng "test" của tôi không được kích hoạt mặc dù chỉ để tham khảo trong tương lai. – DavidB

Trả lời

47

Thay vì scope.$parent.$index bạn có thể xem xét thông qua $ index như một thuộc tính chỉ thị:

<li my-directive index="{{$index}}" ng-repeat="value in values"> 

Chỉ thị:

myApp.directive('myDirective', function() { 
    return { 
     replace: true, 
     // transclude: true, 
     scope: { 
      index: '@' 
     }, 
     template: '<div>testing {{index}}</div>', 
     link: function(scope, element, attrs) { 
      // ... 
     } 
    } 
}); 

Fiddle.

+0

Cuộc gọi tốt về điều này. Đây chính là điều tôi đang muốn làm. – DavidB

+6

Lưu ý: với cú pháp '@', bạn sẽ phải sử dụng attrs. $ Quan sát() nếu bạn muốn sử dụng giá trị chỉ mục bên trong hàm liên kết - xem [câu trả lời này] (http://stackoverflow.com/câu hỏi/14050195/cái gì là khác biệt giữa phạm vi-và-trong-chỉ thị/14063373 # 14063373) để biết thêm thông tin. (Bạn không cần phải sử dụng $ quan sát() nếu bạn chỉ sử dụng giá trị trong một mẫu, như tôi hiển thị trong fiddle.) –

+2

Cá nhân, tôi vẫn thích phạm vi. $ Parent. $ Index vì thêm thuộc tính index là một thông tin bổ sung để người dùng nhớ khi họ cố gắng sử dụng chỉ thị của bạn. Phạm vi sử dụng. $ Parent. $ Index trong trình liên kết của bạn không chỉ cho phép bạn nhận được kết quả tương tự, mà còn làm sạch chỉ thị bằng cách giảm thuộc tính không cần thiết này. Cần chú ý đến việc thiết kế chỉ thị theo cách trực quan giúp người khác dễ dàng sử dụng lại – zeroliu

2

Như bạn đã chỉ ra, bạn có thể lấy chỉ mục bằng cách sử dụng chỉ mục $.

Vì sao chức năng kiểm tra của bạn không kích hoạt, bạn đã không thực thi nó. Trong chức năng liên kết của chỉ thị của bạn, bạn cần một cái gì đó như:

scope.$eval(attrs.myAttr); 
Các vấn đề liên quan