ng-repeat排序在jQuery中引发exception

我有一个由ng-repeat创建的行的表。 表头具有ng-click,用于设置排序的谓词(该函数还确定方向,asc / desc)。 排序工作正常,但由于某种原因,每次我更改谓词和排序时,我都会从jQuery中获得exception。

这是我正在做的一个更好的例子: http ://plnkr.co/edit/qfNcm9RPQSsNgqmm3TYS?p = preview

正如您在plnkr中看到的那样,ng-repeat非常简单。 我们项目中的ng-repeat是相似的,而不是更复杂。

 

这实际上发生在我们代码中的许多地方,我们在它们之间使用不同的排序方法,但它们仍然受到影响。

可以单击表标题以对项目进行排序。 那个plunkr没有出现问题。 即使排序在我的页面上工作,它也会打破页面上的其他内容(就像一个光滑的轮播控件)。 例外是在jquery.js的第1430行(通过包括Sizzle.js的谷歌CDN的版本2.1.1)。 发生exception的方法是Sizzle.attr。 它看起来像是在循环遍历使用ng-repeat创建的所有元素,并从中获取属性值。 当它到达“结束ngRepeat:AllContests | orderBy:sort:ReverseSort中的竞赛”注释时,会发生exception,表示ng-repeat部分的结束。

具体来说,当我尝试在元素上使用getAttribute()时,我得到’Uncaught TypeError:undefined不是函数’。

 return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; 

现在,我可以拉jquery,将它添加到我的项目编辑它,以便它评估elem.nodeName ==“#comment”,并在这种情况下返回null。 我更愿意知道我做错了什么,或者是否有更好的方法。

否则,是否有一种方法可以覆盖该方法并在不编辑jquery库的情况下提供我自己的方法?

编辑

以下是操作中的问题示例: https : //playmlf.com/Lobby/ContestLobby

临时决议

我已经编辑了jQuery库,因此它看起来如此:

 Sizzle.attr = function (elem, name) { if (elem.nodeName == '#comment') return null; // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } 

注意:这只是Sizzle.attr方法的顶部。 第一个if是兴趣线。 如果元素是注释,则返回null。 我不想编辑jquery库,但是我无法弄清楚如何覆盖这个特定的方法,或者在排序期间首先不让它被调用。 我不喜欢这个修复,但同时我花了太多时间在这上面并需要一些有用的东西。 我稍后会支付坏的定额税。

这似乎是因为Comment元素没有getAttribute方法。

记录了一个错误 。 作为一种变通方法,您可以将其添加到您的代码库中,并确保它在早期执行:

 Object.getPrototypeOf(document.createComment('')).getAttribute = function() {}