2014-09-03 22 views
0

我有一张表格,呈现ng-repeat的行。在其中一个单元格中,有一个选择使用ng-options呈现。在AngularJS模板呈现后执行代码

<tr ng-repeat="item in data.items" repeat-done> 
<td > 
    ... 
    <select class="selectpicker" 
     ng-model="person" ng-options="person.Surname for person in data.Persons track by person.Id"> 
    <option value="">Introduce yourself...</option> 
    </select> 
    ... 
<td> 
</tr> 

当重复完成时,我需要将select转为bootstrap-select(一个漂亮的下拉列表)。因此,经过一点研究,我添加了以下指令:

app.directive('repeatDone', function() { 
    return function (scope, element, attrs) { 
     if (scope.$last) { 
      setTimeout(function() { $('.selectpicker').selectpicker(); }, 1); 
     }; 
    }; 
}); 

它在tr处指定(参见上文)。

它的工作原理。但我有点担心是否有机会在慢速PC /平板电脑等上无法正常工作。据我所知,AngularJS具有异步性质。因此,在处理ng-repeat的最后一个元素时,对于此元素仍可能有ng-options(或者对于某些先前的元素也可能)不会呈现。还是我偏执狂?

+0

没有可用[这里](https://github.com/joaoneto/angular-bootstrap-select),可以帮助一个指令包装。 – 2014-09-03 12:08:55

回答

1

你不应该使用超时来同步你的指令。会出现很多问题。

您可以使用选项优先排序何时将使用您的指令。指令以后代的顺序执行。

ngRepeat优先1000(https://docs.angularjs.org/api/ng/directive/ngRepeat) 选择具有优先级0(https://docs.angularjs.org/api/ng/directive/select

如果要声明一个负的优先级就NG-选项后,将执行你的指令。

app.directive('repeatDone', function() { 
    return { 
     priority: -5, 
     link: function (scope, element, attrs) { 
      $('.selectpicker').selectpicker(); 
     } 
    } 
}); 

根据角文档:

优先

当存在单个DOM元素上定义的多个指示, 有时有必要指明该指令 是顺序应用。优先级用于在编译函数被调用之前对指令进行排序。优先级被定义为一个数字。 首先编译具有更大数字优先级的指令。 预链接功能也按优先顺序运行,但链接后链接功能按相反顺序运行。具有相同优先级的 指令的顺序未定义。默认优先级为0。

https://docs.angularjs.org/api/ng/service/ $编译

+0

试过了。似乎没有工作 – SiberianGuy 2014-09-03 14:35:55

+0

为什么它没有工作?在ng-options之前执行了吗? – 2014-09-09 21:32:01

相关问题