Javascript orderBy工作不正常
我创建了3个组-priorty 1、2和3,并使用orderBy:priorty期望每个推送的任务都进入他们的组。但在我用更多的数据进行测试后,我发现在每个小组中都有奇怪的行为,他们没有正确分类Javascript orderBy工作不正常,javascript,angularjs,Javascript,Angularjs,我创建了3个组-priorty 1、2和3,并使用orderBy:priorty期望每个推送的任务都进入他们的组。但在我用更多的数据进行测试后,我发现在每个小组中都有奇怪的行为,他们没有正确分类 <input ng-model="taskName"/> <button ng-click="AddTask()">Push task</button> <li ng-repeat="task in tasks | orderBy:'priorty
<input ng-model="taskName"/>
<button ng-click="AddTask()">Push task</button>
<li ng-repeat="task in tasks | orderBy:'priorty'">priorty {{task.priorty}} - {{task.taskName}}</li>
推送任务
priorty{{{task.priorty}}-{{task.taskName}
新项目不是被推到底部,而是有时被推到顶部/中间,为什么会发生这种情况
试试我的演示:根据
优先级,项目总是以正确的顺序排列
除此之外,对于相同优先级内的项目顺序没有要求(也没有保证)
如果要进行第二级排序,可以将属性列表传递给orderBy
过滤器:
ng-repeat="task in tasks | orderBy:['priorty','taksName']"
另请参见此
关于您问题的“为什么”
(如果您只按“优先级”订购,为什么会重新订购):
它似乎是特定于浏览器的。Firefox上的相同代码在插入第9项后不会对这些项进行“重新排序”(Chrome也是如此)
如果让我猜一猜,我会说这与每个浏览器(内部)保存一些元素引用的方式有关,并且在这一点上他们决定进行一些重新设置。
我没有任何问题。任务总是按优先级排序。你的意思是在一个优先级组中,任务可以有任意的顺序吗?有趣的是,很明显,它们都具有相同的优先级1
,所以这看起来不像是不能正常工作的情况。您可以使用多重排序:orderBy:['priorty','taskName']
按字母表中的每个字母,并注意当按'h'时会发生什么,当有9个具有相同优先级的元素时似乎会发生什么。这看起来是一个很好的解决方案!用taskId订购更好?因为它是到后端的链接,所以我总是希望最新推送的项目位于每个组的最底部。您可以根据您喜欢的任何属性进行订购taskId
确实更有意义,但我在示例中没有使用,因为您似乎没有为新任务分配ID。在“真实”环境中,其他属性肯定更适合(例如创建日期、截止日期、ID等)。我的taskId是自动递增的,因此我认为最好使用它,兄弟,非常感谢您的回答@user3522457:我在“为什么”上添加了一个简短的注释。它似乎是特定于浏览器的。(我还查看了Angular的源代码,在ngRepeat
的实现中找不到任何可能导致这种情况的东西,但我可能遗漏了一些东西。)顺便说一句,如果您真的喜欢,也可以随意向上投票:)