6

Khi xác định chỉ thị ng-lặp để lặp qua một mảng, cú pháp chỉ định ng-repeat="friend in friends", và sau đó trong khuôn mẫu bạn sử dụng toán tử tương ứng như vậy {{friend.name}}.Tôi có thể tránh tên biến đối tượng trong vòng lặp ng-lặp không?

Có thể có các thuộc tính được chỉ định cho phạm vi mục hiện tại, chứ không phải là biến trong đó không? Vì vậy, tôi có thể gọi chỉ {{name}} thay vì {{friend.name}}?

Lý do là chỉ thị của tôi đang được sử dụng trong phạm vi của hai mẫu khác nhau - ví dụ: tôi có thể có chỉ thị "userActions" được sử dụng trong cả bộ lặp và bên trong mẫu không liên quan ở đâu {{friend.name}} giác quan. Tôi muốn tránh giả tạo đối tượng friend ở nơi nó không có ý nghĩa ngữ nghĩa.


trường hợp sử dụng của tôi là một cái gì đó như thế này:

Tôi có một mạng lưới mà ám khối các loại. Một số mã giả:

<div ng-repeat="block in blocks"> 
    < cat block /> 

    < friend block > 
     <userActions directive /> 
    </ friend block > 

    < guitar block /> 

    .... more blocks 
</div> 

Tôi cũng có một trang người bạn, có chứa các hành động cùng một người dùng chính xác:

..fragment of friend page.. 
    <element ng-control="friend"> 
    <userActions directive /> 
    </element> 

Bây giờ, nếu tôi muốn sử dụng một tài sản của khối bên trong lặp lại, các cú pháp là {{block.name}}. Vì vậy, các mẫu cho userActions chứa này.

Tuy nhiên, khi tôi sử dụng mẫu này trong trang bạn bè, tôi phải tạo {{block.name}} bên trong phạm vi của bộ điều khiển của bạn bè. Điều này không có ý nghĩa mặc dù, bởi vì khối chỉ tồn tại trong bối cảnh của lưới khối. Tôi không cần phải tạo số này block.

Điều tôi muốn làm, chỉ cần gọi {{name}} từ trong mẫu chỉ thị userActions vì cả phạm vi khối và bộ điều khiển đều chứa nó. Tôi không muốn tạo đối tượng block, sau đó đặt một cách giả tạo block.name trong mỗi phạm vi mà tôi muốn sử dụng chỉ thị userActions.

Dưới đây là một jsFiddle to illustrate the cause

+0

Tôi giả định ở đây rằng ví dụ bạn đã cung cấp chỉ nhằm mục đích minh họa và những gì bạn đang cố gắng phức tạp hơn? Có lẽ bạn có thể mô tả những gì bạn đang cố gắng để làm gì? Nên có một cái gì đó phổ biến ở giữa người bạn và khối - vâng? Hoặc người nào khác nó không có nghĩa là bạn đang sử dụng cùng một khuôn mẫu cho cả hai. – ganaraj

+0

Btw ở đây là một câu đố giải quyết vấn đề của bạn. Không chắc chắn nếu đó là những gì bạn đang tìm kiếm. Bạn cần lưu ý rằng chúng ta đang tạo ra một phạm vi cô lập. http://jsfiddle.net/b7KEm/6/ – ganaraj

+0

Vâng fiddle chỉ đại diện cho một ví dụ giảm của vấn đề. Rõ ràng ứng dụng của tôi phức tạp hơn nhiều :) Hãy để tôi xây dựng - Khối thể hiện quan điểm của một số thực thể có thể. Một trong những thực thể này là "bạn". Mỗi thực thể bạn bè có một tập hợp các hành động của người dùng có thể được liên kết với nó. Ví dụ của chúng ta - hành động là "giết" và "ôm". Những hành động này có thể được thực hiện từ * cả * ngữ cảnh của khối bạn bè cũng như trang bạn bè. Chúng chứa cùng một khuôn mẫu và logic và do đó chia sẻ cùng một chỉ thị. – OpherV

Trả lời

2

Tôi đã quyết định kết hợp các câu trả lời thông tin của Mathew Bergganaraj với kiến ​​thức mới của tôi để tạo câu trả lời hữu ích cho điều này.

Câu trả lời ngắn gọn là Bạn thực sự không muốn làm điều đó.


Câu trả lời còn là thế này:.

Khi sử dụng ng-repeat="block in blocks ", một phạm vi mới được tạo ra cho mỗi phần tử khối, và các thuộc tính của mọi đối tượng khối được tạo ra trong scope.block của mỗi khối Đây là một điều tốt, bởi vì điều này có nghĩa tất cả các thuộc tính có thể được truy cập bằng cách tham khảo, cập nhật hoặc $ theo dõi.

Nếu ng-repeat sẽ không làm điều đó, và tất cả các thuộc tính chỉ sẽ tát cho đến phạm vi của khối, sau đó tất cả nguyên thủy trong block (chuỗi, ints, v.v.) sẽ được sao chép từ đối tượng khối cho đối tượng phạm vi khối. Một thay đổi trong một sẽ không phản ánh trên khác, và đó là xấu. More info on that here.

Ok vì vậy bây giờ chúng tôi đã quyết định đó là một điều tốt hơn là một điều xấu, làm cách nào để khắc phục vấn đề ngữ nghĩa? Tôi đã quyết định sử dụng container friendData đối tượng như đối tượng trên phạm vi chỉ thị của tôi, và vì vậy chỉ hy vọng các thuộc tính friend-data để giữ các tài sản có liên quan

angular.module('myApp',[]) 
.directive("lookActions", function(){ 
    return {    
     restrict: 'E',   
     template: "<input value='Kill -{{ friendData.name }}-' type='button'>", 
     scope : { 
      friendData : '='    
     } 
    } 
}); 

Bằng cách này tôi có thể gán đối tượng này bất kể là bối cảnh tôi đang gọi mẫu chỉ thị của mình.

Với những bối cảnh điều khiển:

function gridCtrl($scope) {  
    $scope.blocks = [{ type: "cat", name: "mitzi"},{ type: "friend", name: "dave"},{ type: "guitar", name: "parker"}]; 
} 


function friendCtrl($scope) {  
    $scope.data={ 
     name: "dave" 
    } 
} 

Làm thế nào để gọi chỉ thị -

Trong vòng một ng-repeat:

<div class="block" ng-repeat="block in blocks" >    
     <look-actions friend-data="block" /> 
    </div> 

Hoặc trong một bối cảnh khác biệt:

<div ng-controller="friendCtrl"> 
     <look-actions friend-data="data" /> 
    </div> 

Đây là solution Fiddle

Cảm ơn sự giúp đỡ của bạn!

1

Tất cả phụ thuộc vào cách bạn cấu trúc thị của bạn. Thật khó để nói mà không có một fiddle/plunkr mã của bạn trông như thế nào tôi đang dùng một đâm trong bóng tối ở đây. Ngay bây giờ tôi nghĩ rằng những gì bạn đang cố gắng để nói là trong bối cảnh nơi bạn đang sử dụng chỉ dẫn của bạn friend.name không có ý nghĩa. Có lẽ một cái gì đó chung chung hơn như person.name có thể thích hợp hơn.Trong trường hợp đó, bạn có thể làm như sau để bạn vượt qua vào chỉ thị những gì bạn muốn người đó có liên quan đến:

Html

<div data-ng-repeat="friend in friends"> 
    {{ friend.name }} 
    <div class="myDirective" data-person="friend"></div> 
</div> 

javascript

.directive("myDirective", function(){ 
    return { 
     restrict: 'C', 
     scope: { 
      person: "=person" 
     }, 
     template: "<div>{{ person.name }}</div>" 

    } 
}); 

jsfiddle: http://jsfiddle.net/5aVLf/1/

+0

Đánh giá cao đầu vào, nhưng đây không phải là trường hợp sử dụng của tôi. Tôi đã chỉnh sửa câu hỏi của tôi, hy vọng nó có phần rõ ràng hơn bây giờ. Tôi muốn tránh tạo đối tượng 'person' trong phạm vi chỉ thị. – OpherV

+0

Bạn có thể tạo một jsfiddle không? –

+0

Tôi đã tạo một jsfiddle, hãy xem – OpherV

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