我有一个表,其中包含由 ng-repeat 创建的行。表头有一个 ng-click,用于设置排序谓词(该函数还确定方向,asc/desc)。排序工作正常,但由于某种原因,每次更改谓词并且排序触发时,我都会收到 jQuery 的异常。
这是我正在做的事情的一个例子:http://plnkr.co/edit/qfNcm9RPQSsNgqmm3TYS?p=preview 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 没有表现出这个问题。尽管排序在我的页面上有效,但它会破坏页面上的其他内容(例如光滑的旋转木马 http://kenwheeler.github.io/slick/控制)。例外情况是 jquery.js 中的第 1430 行(版本 2.1.1,通过 Google CDN,其中包括 Sizzle.js)。发生异常的方法是Sizzle.attr。看起来正在发生的事情是循环遍历使用 ng-repeat 创建的所有元素,并从中获取属性值。当到达“ end ngRepeat:AllContests中的竞赛 | orderBy:sort:ReverseSort ”注释(表示 ng-repeat 部分结束)时,会发生异常。
具体来说,当它尝试在元素上 getAttribute() 时,我收到“未捕获的类型错误:未定义不是函数”。
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 库?
EDIT
以下是实际问题的示例:https://playmlf.com/Lobby/ContestLobby 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 库,但我无法弄清楚如何覆盖这个特定的方法,或者阻止它在排序过程中首先被调用。我不喜欢这个修复,但同时我在这上面花了太多时间并且需要一些有用的东西。我稍后会缴纳不良修复税。