看起來好像在抱怨你的模板。
通過做'<li data-ng-repeat="item in ' + scope.items + '">'
你實際上是將scope.items轉換爲字符串。你不想要那個,你想讓它通過你的物品數組中的物品。
所以,你會怎麼做:'<li data-ng-repeat="item in items">'
你已經通過scope屬性添加項目到你的範圍:
scope: {
items: "=",
itemLabelField: "@" //read below
}
這足以解決您的問題,但正如你所知道的,我我也添加了itemLabelField,所以你不需要使用var itemLabelField = attrs.itemLabelField
。 @ binder通過值綁定,而不是父級的範圍。
因此,您可以代替'{{item.' + itemLabelField + '}}'
'{{item[itemLabelField]}}'
。
現在你會發現你的鏈接函數只有一個帶有編譯的純字符串模板。理想情況下,您將使用模板屬性,而不是在元素內手動插入代碼。
template:
'<ul>' +
'<li ng-repeat="item in items">' +
'{{item[itemLabelField]}}' +
'</li>' +
'</ul>'
你甚至可以把它放在一個單獨的文件中並使用templateUrl屬性。
以下是完整的更改代碼:http://jsfiddle.net/DA47k/12/
var app = angular.module('myApp', []);
app.controller('myCtrl', function ($scope) {
$scope.open = false;
$scope.items = [
{ name: 'A', value: 1 },
{ name: 'B', value: 2 },
{ name: 'C', value: 3 }
];
});
app.directive('myDirective', function() {
return {
restrict: 'A',
scope: {
items: "=",
itemLabelField: "@"
},
template:
'<ul>' +
'<li ng-repeat="item in items">' +
'{{item[itemLabelField]}}' +
'</li>' +
'</ul>'
}
});
而只是爲了補充,一致性兼用的一個NG-XXXX或數據-NG-XXXX(或NG:XXXX)的屬性,而不是將它們混合。
在傳遞整個items數組和itemLabelField時,要點是什麼? itemLabelField值位於items數組中。似乎多餘。 –
只是保持它與問題一致。它在實踐中可能有不同的價值,取決於它在哪裏以及如何使用。但是,在這個例子中,最好對它進行硬編碼,以便item [itemLabelField]成爲'item.name'。 – Jahed