angular:如何处理属性提供的代码

时间:2014-03-06 13:55:07

标签: javascript angularjs angularjs-directive

作为我想要的一个例子,请考虑以下示例

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

我需要这个的主要原因是因为我不知道持有标签文本的属性名称(在这种情况下是文本

2 个答案:

答案 0 :(得分:1)

我提供了一个小提琴,看看这是否有帮助。我没有传入“options.text for options in options”,而是将其设置为传递“options”数组,然后传递所需的字段。我假设该字段将被设置为变量;如果它是硬编码的,那么你可以改为使用field ='someFieldName'。

http://jsfiddle.net/y376K/1/

<强> 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