我有一个由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库,但我无法弄清楚如何覆盖这个特定的方法,或者在排序过程中不让它首先被调用。我不喜欢这个修复,但同时我花了太多时间在这上面并需要一些有用的东西。我稍后会支付坏的定额税。
答案 0 :(得分:6)
这似乎是因为Comment元素没有getAttribute方法。
为此记录了a bug。作为一种变通方法,您可以将其添加到您的代码库中,并确保它在早期执行:
Object.getPrototypeOf(document.createComment('')).getAttribute = function() {}