6

定義一個ng-repeat指令遍歷數組時,語法指定ng-repeat="friend in friends",然後在模板中使用interoplation運算符,如{{friend.name}}我可以在ng-repeat循環中避免對象變量名嗎?

是否有可能將屬性分配給當前項目範圍,而不是其中的變量?所以我可以撥打{{name}}而不是{{friend.name}}

原因是我的指令被用在兩個不同模板的範圍內 - 例如我可能有一個指令"userActions",它既用於中繼器也用於不相關的模板,其中{{friend.name}}沒有使用感。我想避免人爲地製造不具有語義含義的對象。


我的使用情況是這樣的:

我呈現不同類型的塊網格。一些僞代碼:

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

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

    < guitar block /> 

    .... more blocks 
</div> 

我也有一個朋友頁,包含完全相同的用戶操作:

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

現在,如果我想用戶塊的屬性中繼器裏面,語法是{{block.name}}。所以userActions的模板包含這個。

但是,一旦我在的好友頁面中使用此模板,我必須創建{{block.name}}範圍內的好友控制器。這雖然沒有意義,因爲塊只存在於塊網格的上下文中。我不應該創建block

我想要做的就是從userActions指令模板中調用{{name}},因爲塊作用域和控制器都包含它。我不想創建block對象,然後在我想要使用userActions指令的每個範圍內人爲設置block.name

這裏有一個jsFiddle to illustrate the cause

+0

我在這裏假設您提供的示例僅用於說明目的,您所嘗試的內容更復雜?你能否描述你正在嘗試做什麼?朋友和街區之間應該有一些共同之處 - 是的?否則它沒有任何意義,你使用相同的模板爲他們兩個。 – ganaraj 2013-04-04 15:25:27

+0

順便說一句,這是一個解決你的問題的小提琴。不知道這是你在找什麼。您需要注意的是,我們現在正在創建一個隔離範圍。 http://jsfiddle.net/b7KEm/6/ – ganaraj 2013-04-04 15:28:09

+0

是的小提琴只是一個簡化的例子。很明顯,我的應用程序要複雜得多:)讓我詳細說明 - Block表示幾個可能實體的視圖。其中一個實體是「朋友」。每個朋友實體都有一組可以與之關聯的用戶操作。對於我們的例子 - 行動是「殺」和「擁抱」。這些操作可以從朋友頁面的上下文以及朋友頁面的* both *中執行。它們包含相同的模板和邏輯,因此共享相同的指令。 – OpherV 2013-04-04 17:46:57

回答

2

我決定將Mathew Bergganaraj的信息性答案與我的新知識結合起來,爲此創建一個有用的答案。

簡短的回答是你真的不想那麼做


較長答案是這樣的:

當使用ng-repeat="block in blocks「,對於每個塊元件創建一個新的範圍,而每塊對象的特性在每個塊的scope.block創建這是一個好事,因爲這意味着所有的屬性可以通過引用訪問,更新或$觀看。

如果ng-repeat不會那樣做,而且所有屬性將只對塊的範圍被掌摑,然後在block所有原始數據(字符串,整數等)只是從中複製而來塊對象到塊作用域對象。一個人的改變不會反映在另一個人身上,那很糟糕。 More info on that here.

好吧,我們已經決定這是一件好事,而不是壞事,我們如何克服語義問題?我決定使用friendData對象容器作爲對象在我的指令範圍,因此該指令預計friend-data屬性保留相關屬性

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

這樣我可以將這個對象無論是哪上下文我打電話給我的指令模板。

鑑於這些控制器上下文:

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


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

如何調用指令 -

在一個ng-repeat

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

或者在差異方面:

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

以下是solution Fiddle

感謝您的幫助!

1

這一切都取決於你如何組織你的指令。很難說沒有小提琴/ plunkr你的代碼是什麼樣子,所以我在黑暗中刺中。現在我認爲你想說的是,在你使用你的指令friend.name的地方是沒有意義的。也許像person.name這樣更通用的東西可能更合適。在這種情況下,你可以做以下讓你在傳遞給指令你想要的人與相關的內容:

的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>" 

    } 
}); 

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

+0

欣賞輸入,但這不是我的使用案例。我編輯了我的問題,希望現在有些更清楚。我想避免在指令作用域中創建'person'對象。 – OpherV 2013-04-04 13:51:06

+0

你可以創建一個jsfiddle嗎? – 2013-04-04 13:52:00

+0

我已經創建了一個jsfiddle,請看看 – OpherV 2013-04-04 14:49:46