2014-03-06 26 views
0

提供为我想要什么的示例代码,考虑下面的例子角度:如何处理属性

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

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

回答

1

我提供了一个小提琴,看看这是否有助于。除了传递“options.text在选项选项”中,我把它,这样你通过“选项”数组,然后你想要的领域。我假设该领域将被设置为一个变量;如果它是硬编码的,那么你可以改为使用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

您可以通过解析属性做到这一点。另一个解决办法是把它作为两个属性(见对方的回答)

你或许应该使用正规的,但我很快编码这样的:

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

+0

我检查角码,并看到他们有一个非常令人印象深刻的正则表达式来分割该字符串。我不认为这是首选的解决方案! –

+0

我第一次尝试使用正则表达式,但不明白发生了什么事。这只是为了展示基本的想法。 –