2013-11-09 17 views
5

Tôi là một người dùng mới của AngularJS và tôi gặp khó khăn khi tôi phải truy cập vào một biến trong một bộ điều khiển từ một chỉ thị bên trong một ng-lặp lại. Tôi nghĩ rằng nó phải là một cái gì đó liên quan đến phạm vi.Làm thế nào để truy cập vào phạm vi điều khiển từ một chỉ thị bên trong ng-lặp lại?

Dưới đây là fiddle tôi: http://jsfiddle.net/Zzb58/1/

Phạm vi 'MyCtrl' có hai thuộc tính: "items", một mảng, và "điều", chỉ là một chuỗi.

function MyCtrl($scope) { 
    $scope.items = [{id: 'item1'}, {id: 'item2'}];  
    $scope.thing = "thing"; 
} 

Vì vậy, nếu tôi có thể tạo một chỉ và tôi muốn nó để đọc nội dung của mảng, chương trình này hoạt động hoàn hảo:

<div my-directive ng-repeat="item in items" item='item'></div> 
app.directive('myDirective', function() { 
    return { 
     restrict: 'AE', 
     scope: { 
      item: '=item', 
     }, 
     template: '<div>{{ item.id }}</div>' 
    } 
}); 

HTML được làm mới đúng.

Nhưng nếu tôi cố gắng truy cập biến "điều" từ chỉ thị, nó luôn được đọc là "không xác định".

app.directive('myDirective', function() { 
    return { 
     restrict: 'AE', 
     scope: { 
      item: '=item', 
      thing: '=' 
     }, 
     template: '<div>{{ item.id }} - Here is not the {{thing}}</div>' 
    } 
}); 

Tôi nghĩ rằng vấn đề phải liên quan đến phạm vi con được tạo trong ng-lặp lại hoặc có thể biến không bị ràng buộc chính xác.

Tuy nhiên, nếu tôi sử dụng $ parent.thing trong mẫu, biến được đọc và được đánh giá đúng, nhưng tôi không biết liệu $ parent đó là phạm vi ng-lặp lại hay 'MyCtrl'.

1) Tôi đang làm gì sai?

2) Tại sao cần phải đặt phần tử "mục" đọc trong ng-lặp lại làm thuộc tính của phần tử HTML? Đầu tiên tôi nghĩ "các mục" nằm trong phạm vi cha mẹ, vì vậy khi phạm vi cô lập của chỉ thị được tạo, tôi sẽ chỉ phải làm một cái gì đó như "items: '='".

+1

Nếu bạn sử dụng '=' thì bạn phải chuyển thuộc tính như vậy 'điều =" điều "'. – elclanrs

Trả lời

4

Bằng cách gán một đối tượng cho nó, bạn tạo một phạm vi cách ly. Nếu bạn đặt scope : true, bạn có thể sử dụng nó như trong ví dụ của mình, nếu không bạn phải chuyển nó làm thuộc tính, giống như bạn đã thực hiện với item.

http://jsfiddle.net/Zzb58/2/

Để giải thích về chế độ khác nhau về phạm vi, bạn có thể đọc phần chỉ thị trên trang này: https://github.com/angular/angular.js/wiki/Understanding-Scopes

chung nhưng đặc biệt là khi làm việc với các giá trị phạm vi kế thừa, tôi cũng rất muốn khuyên bạn sử dụng một đối tượng có thuộc tính được thiết lập, thay vì một biến chuỗi đơn giản, vì điều này có thể dẫn đến sự tách rời trong phạm vi phạm vi do cách thức hoạt động của nguyên mẫu.

+0

Nó hoạt động! Tôi nghĩ rằng tôi bắt đầu hiểu phạm vi và sự thừa kế nguyên mẫu JavaScript ... Cảm ơn bạn rất nhiều! – Jorge

+0

Bạn được chào đón (: –

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