ng-repeat排序在jQuery中引发异常

时间:2014-12-10 18:43:03

标签: jquery angularjs exception angularjs-ng-repeat

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

以下是我正在做的事情的一个例子:http://plnkr.co/edit/qfNcm9RPQSsNgqmm3TYS?p=preview

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

<tr ng-repeat="contest in AllContests | orderBy:sort:ReverseSort" ng-show="contest.isVisible">

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

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

具体来说,我得到了&#39; Uncaught TypeError:undefined不是一个函数&#39;当它试图在元素上使用getAttribute()时。

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

现在,我可以拉jquery,将它添加到我的项目编辑它,以便它评估elem.nodeName ==&#34;#comment&#34;,并在这种情况下只返回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库,但我无法弄清楚如何覆盖这个特定的方法,或者在排序过程中不让它首先被调用。我不喜欢这个修复,但同时我花了太多时间在这上面并需要一些有用的东西。我稍后会支付坏的定额税。

1 个答案:

答案 0 :(得分:6)

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

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

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