我想在内容更改时创建一个具有自定义行为的列表。我尝试为此创建一个指令,但我对如何将 ng-transclude 与 ng-repeat 指令结合起来有点迷茫。有人可以让我走上正轨吗?
html:
<div ng-app="myApp">
<div ng-controller="ctrl">
<mylist items="myItem in items">
<span class="etc">{{myItem}}</span>
</mylist>
</div>
</div>
Javascript:
angular.module('myApp', [])
.controller('ctrl', function ($scope) {
$scope.items = ['one', 'two', 'three'];
})
.directive('mylist', function () {
return {
restrict:'E',
transclude: 'element',
replace: true,
scope: true,
template: [
'<ul>',
'<li ng-repeat="WhatGoesHere in items" ng-transclude></li>',
'</ul>'
].join(''),
link: function (scope, element, attr) {
var parts = attr.items.split(' in ');
var itemPart = parts[0];
var itemsPart = parts[1];
scope.$watch(itemsPart, function (value) {
scope.items = value;
});
}
}
});
我有一部分在这里工作
编辑:
标准:
- 项目的模板必须在视图中定义,而不是在指令中,并且它必须能够访问子范围内的项目属性。理想情况下,我想像在 ng-repeat 指令中那样定义它
- 该指令必须有权访问该列表,以便我可以设置适当的手表并进行更改。如果可能的话,我希望能够轻松访问生成的 DOM 项目(我也可以使用它
element[0].querySelectorAll('ul>li')
或其他东西来实现,它只需要在 Chrome 上工作)。 - 如果可能的话,我想重用 ng-repeat 指令中的逻辑,因为它已经做了很多我想做的事情。最好我不想复制代码。我只想增强它的行为,而不是改变它