作为我想要的一个例子,请考虑以下示例
<select ng-options="option.text for option in options"></select>
在我的指令中,我想使用类似于ngOptions的东西,因为我需要创建一个列表
例如,假设我有一个指令barFoo,如下所示:
<bar-foo options="options"></bar-foo>
使用模板/ html如下:
<ol>
<li ng-repeat="option in options" ng-bind="option.text"></li>
</ol>
需要将所有这些内容更改为
之类的调用<bar-foo options="option.text for option in options"></bar-foo>
我需要这个的主要原因是因为我不知道持有标签文本的属性名称(在这种情况下是文本)
答案 0 :(得分:1)
我提供了一个小提琴,看看这是否有帮助。我没有传入“options.text for options in options”,而是将其设置为传递“options”数组,然后传递所需的字段。我假设该字段将被设置为变量;如果它是硬编码的,那么你可以改为使用field ='someFieldName'。
<强> HTML 强>
<body ng-app='testApp'>
<div ng-controller='TestCtrl'>
<bar-foo options='options' field='{{optionsField}}'></bar-foo>
</div>
</body>
<强> JS 强>
angular.module('testApp', [])
.controller('TestCtrl', function($scope) {
$scope.options = [
{
text: 'Node.js rocks my socks',
language: 'Node.js',
},
{
text: 'Angular is hot',
language: 'Angular.js',
},
{
text: 'Backbone.js is mmmm',
language: 'Backbone.js',
}
];
$scope.optionsField = 'text';
})
.directive('barFoo', function() {
return {
restrict: 'E',
scope: {
options: '=',
field: '@'
},
template: '<ol><li ng-repeat="option in options" ng-bind="option[field]"></li>'
};
})
答案 1 :(得分:1)
您可以通过解析属性来完成此操作。另一种解决方案是将其作为两个属性传递(参见另一个答案)
你可能应该使用正则表达式,但我很快编码:
app.directive('barFoo',function($parse) {
return {
restrict: 'E',
scope: {},
templateUrl: "template.html",
link: function(scope,element,attrs) {
var splitOptions = attrs.options.split(' for ');
scope.fieldName = splitOptions[0].split('.')[1];
var repeatExp = splitOptions[1];
scope.valueName = repeatExp.split(' in ')[0];
var collectionName = repeatExp.split(' in ')[1];
scope.values = $parse(collectionName)(scope.$parent);
}
};
});
请参阅this plnkr