ng-grid:为什么afterSelectionChange()调用两次?

时间:2014-05-02 02:13:16

标签: angularjs ng-grid

我不喜欢this question的答案。在我看来,它的代码味道很糟糕。

我是Angular的新手,所以如果我创建了一个Plunk来帮助那个提问者,我想我可以学到一些东西。

我的Plunk是http://plnkr.co/edit/fJcew7cGCPzJ0nhIQXjg?p=preview,但有两件事我不明白。

请注意,我以两种方式分配了ng-grid的数据 - 一次击落并逐行。评论一个&取消注释另一个玩弄它。

请务必按F12查看开发人员的控制台日志消息。

1)为什么我会收到两个ngGridEventData事件?

2)为什么,当我逐行推送()时,每次push()都没有得到一个ngGridEventData事件?    我正在尝试使用3个网格(与当前问题无关)实现主/详细/更详细,并且已经谷歌搜索了几天。很多人似乎相信他们会得到多个ngGridEventData事件,并想知道如何检测网格是否完全渲染(因此检查我的Plunk)。

简而言之,任何人都可以详细解释ngGridEventData的工作原理吗?谢谢;你的答案会帮助很多人。

1 个答案:

答案 0 :(得分:1)

在最近的一篇答案here中,我展示了一些关于这种奇怪行为的知识。似乎这个例程被称为2次,原因是我无法理解(缓存可能?)。

如果您只是在数据对象是克隆时做出反应,那么您可以使用它:

  if (data.selected === true) {
    if (data.isClone) {
      numSelectionChanges = numSelectionChanges + 1;
      console.log("afterSelectionChange", 'Selection has chanegd ' + numSelectionChanges + ' times');
      console.table(data);
    }
  }

尝试一下,如果你发现为什么会这样,请告诉我。

更多调查结果更新:

看看这个Plunker

我已将ng-grid.js脚本直接包含在plunker中。 如果你看行3344-3349,你会发现这段代码:

$scope.$on('$destroy', $scope.$parent.$watch(options.data, dataWatcher));
$scope.$on('$destroy', $scope.$parent.$watch(options.data + '.length', function() {
     dataWatcher($scope.$eval(options.data));
     $scope.adjustScrollTop(grid.$viewport.scrollTop(), true);
}));

正如你所看到的,有两个观察者应用,看起来像是对我的改变的遗留物。 (虽然我不确定,我傻了,那些家伙很聪明)。但是,如果我评论第一行,一切似乎都按预期工作。

尝试此操作时要小心,因为它可能会破坏其他功能。我对这么长的源代码中的黑客行为不太满意。如果某个实际的ng-grid团队成员看到这个,他可以告诉我是否发现了一个错误以及如何报告错误。 (之前从未这样做过!)