滚出视图时,Ui-grid会在错误的文本框上触发ng-blur

时间:2017-04-13 14:03:04

标签: angularjs angular-ui-grid

我们在celltemplates上使用textbox,而不是使用editableCellTemplate。

http://plnkr.co/edit/M8Do1p?p=preview

  <input class="grid_textbox text-center" 
  ng-blur="grid.appScope.quantityChanged(row.entity)"
  ng-model="MODEL_COL_FIELD" style="width:80%"/>

我们通过在文本框中捕获ng-blur来识别更改。但是,我们注意到当用户滚动时文本框不在视图中时,它不会在正确的文本框上触发ng-blur。

在plnkr中重现

  1. 点击第一个文本框。
  2. 点击第二个文本框,这将显示Blur事件的信息。这是预期的行为
  3. 要重现错误,请单击“清除”,然后再次单击第一个文本框。
  4. 向下滚动直至中间底部,然后单击文本框。它不会输出与上面相同的信息。
  5. 有没有办法解决此问题或解决方法以获取已编辑的行?

    更新: 我已经尝试过Guranjan的解决方案并且它有效,但另一个问题出现了。我不确定这是否应该是另一个问题,但它仍然与滚动和模糊有关。

    复制

    1. 点击第一个文本框并输入一个数字
    2. 滚动直到它不在视野范围内。
    3. 点击另一个文本框并进行编辑。
    4. 这次只是滚动。您可以看到光标聚焦于其他文本框而不会触发模糊。
    5. 编辑一个。然后再次滚动(鼠标滚轮或拖动滚动条)。编辑然后滚动。
    6. 点击一个文本框以触发模糊。它不会显示所有编辑内容。
    7. 这是Guranjan的尝试者。 http://plnkr.co/edit/RWM2y7NLC7821c9vQDO6?p=preview

1 个答案:

答案 0 :(得分:2)

这是因为ui-grid重用元素。解决问题的一种方法是,将当前行的值存储在focus上,并在blur上使用该值。例如,在您的应用范围中创建变量:

$scope.currentValue = {};

然后你可以在输入焦点上更新它:

ng-focus="grid.appScope.currentValue = row.entity"

然后您可以使用$scope.currentValue做任何您需要做的事情。

Updated Plnkr