7

我有一个 AngularJS 应用程序,它在表格中列出了一堆项目。像这样:

<table class='unstyled tmain'>
  <tr>
    <td ng-click='setSort($event)'>X</td>
    <td ng-click='setSort($event)'>Desc</td>
    <td ng-click='setSort($event)'>created</td>
    <td>&nbsp;</td>
  </tr>
  <tr ng-repeat="item in items | orderBy:itemNormalizationFunction:sortReverse">
    <td><input type='checkbox' ng-model='item.done'
             ng-click='onCheckedChanged(item)'/></td>
    <td><div edit-in-place="item.text"
             on-save="updateItemText(value,previousValue,item)"></div></td>
    <td><span class='foo'>{{item.created | dateFormatter}}</span></td>
  </tr>
</table>

表格标题可单击以设置排序顺序。每个数据行中第二列的单元格是可“就地”编辑的 - 如果您单击文本,它将被输入文本框替换,并且用户可以编辑文本。我有一个小指令可以做到这一点。这一切都有效。

编辑时出现问题。假设我将其设置为按“描述”(第二列)排序。然后,如果我编辑描述(通过就地编辑指令),当我在输入框中输入时,排序顺序会发生变化。如果我更改前几个字符,那么角度会重新排序,并且该项目不再位于我的光标下。它甚至没有重点。我必须在列表中搜索以找出它被重新排序到的位置,然后我可以重新集中注意力并继续打字。

这有点蹩脚。

我想做的是告诉 angular (a) 在我键入输入框时停止重新排序,或者 (b) 对单独的(未显示的)索引值进行排序,该索引值在编辑开始之前保留排序. 但我不知道该怎么做。谁能给我一个提示?

我知道这有点复杂,所以我会尝试整理一个 plunkr 来展示正在发生的事情。

4

2 回答 2

3

这是显示我如何解决问题的 plunkr。

http://embed.plnkr.co/eBbjOqNly2QFKkmz9EIh/preview

于 2013-07-27T03:57:30.337 回答
0

您可以创建自定义过滤器并仅在必要时调用它。例如,当您单击“网格标题”进行排序或在向数组动态添加/删除值之后,或者只需单击一个按钮(刷新网格)

您需要依赖注入 Angular过滤器排序过滤器

angular
   .module('MyModule')
   .controller('MyController', ['filterFilter', '$filter', MyContFunc])

     function ExpenseSubmitter(funcAngularFilter, funcAngularFilterOrderBy) {
       oCont = this;
       oCont.ArrayOfData = [{
         name: 'RackBar',
         age: 24
       }, {
         name: 'BamaO',
         age: 48
       }];
       oCont.sortOnColumn = 'age';
       oCont.orderBy = false;
       var SearchObj = {
         name: 'Bama'
       };

       oCont.RefreshGrid = function() {
         oCont.ArrayOfData = funcAngularFilter(oCont.ArrayOfData, SearchObj);
         oCont.ArrayOfData = funcAngularFilterOrderBy('orderBy')(oCont.ArrayOfData, oCont.sortOnColumn, oCont.orderBy);
   }
 }

并在 HTML 中调用类似:

<table>
  <thead>
    <tr>
      <th ng-click="oCont.sortOnColumn = 'age'; oCont.RefreshGrid()">Age</th>
      <th ng-click="oCont.sortOnColumn = 'name'; oCont.RefreshGrid()">Name</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="val in oCont.ArrayOfData">
      <td>{{val.age}}</td>
      <td>{{val.name}}</td>
    </tr>
  </tbody>
</table>
于 2015-01-29T07:50:25.090 回答