我正在尝试将tinysort用作我使用jquery mobile构建的移动应用程序的一部分。我的应用程序在用户位置附近找到了位置,我希望能够快速对结果进行排序,而无需花时间重新查询数据库。
所以,我想要做的是能够使用tinysort重新排序结果,如果用户在该区域中有一个喜欢的位置,然后是距离,另外我希望能够按属性排序“如果用户已经标记过他们去过一个地方。
这就是我想要做的: 按收藏排序:
$("ul#places>li").tsort('',({order:"desc",attr:"myfav"},{order:"asc",attr:"dist"}));
排序依据:
$("ul#places>li").tsort('',({order:"desc",attr:"beenthere"},{order:"asc",attr:"dist"}));
默认排序://这很简单,没问题:
$("ul#places>li").tsort('',{order:"desc",attr:"dist"});
使用默认列表顺序,如:
<ul id="places">
<li myfav="0" beenthere="0" dist=".02">Hot Dog Stand</li>
<li myfav="1" beenthere="0" dist=".08">Joe's Shack</li>
<li myfav="0" beenthere="1" dist=".10">Frick frack</li>
<li myfav="1" beenthere="1" dist=".15">Mama's</li>
</ul>
按fav排序应返回:
排序依据应该返回:
然后回到距离排序:
我对上面的tsort的调用只是不使用多个属性选择器,我的语法错误或者您无法对多个条件进行排序。
有关如何使用tsort或其他解决方案实现此目标的任何想法都表示赞赏!
答案 0 :(得分:6)
我明白Mottie的解决方案有效,但看起来有点复杂......两次打电话给tsort是有用的:
listOfItems.tsort({data:sorter, order:direction})
.tsort({data: sorterAlt, order:direction})
在你的情况下,它是(如果''
只是引用所选项目,你可以删除它们):
$("ul#places>li").tsort({order:"desc",attr:"myfav"})
.tsort({order:"asc",attr:"dist"})
$("ul#places>li").tsort({order:"desc",attr:"beenthere"})
.tsort({order:"asc",attr:"dist"})
同样使用HTML5的data-attrname
样式,正如Mottie建议的那样。您可以随时在tsort中使用data: attrname
。
希望它仍然可以帮助你或其他人!
答案 1 :(得分:0)
您上面的结果实际上按“asc”排序,而不是您所指示的“desc”。无论哪种方式,我都不认为TinySort内置了多个属性排序,所以下一个最好的方法就是组合你想要排序的属性。
由于距离是默认排序,我认为最好将它与其他属性的数值组合。例如,myfav属性设置为“1”表示它是真的(我假设这个,但它似乎是你的意图)。如果我把这个贴在距离的前面,它的值最终会高于零值的假值 - 这与你想要的排序方向相反,所以我将真值分配为“0”而不是“1”并且假值为“9”而不是“0”。我知道这听起来很混乱,但请查看:
按Fav排序:
Location fav been dist combined
1. Joe's Shack 1 0 .08 0.08
2. Mama's 1 1 .15 0.15
3. Hot Dog Stand 0 0 .02 9.02
4. Frick frack 0 1 .10 9.10
排序依据:
Location fav been dist combined
1. Frick frack 0 1 .10 0.10
2. Mama's 1 1 .15 0.15
3. Hot Dog Stand 0 0 .02 9.02
4. Joe's Shack 1 0 .08 9.08
我希望这说清楚......无论如何,这里是一个demo,在那里我进行了排序顺序切换,以及我使用的代码:
var list = $("ul#places>li"),
sortit = function(el, att){
$(el).toggleClass('desc');
var combo,
order = $(el).is('.desc') ? 'desc' : 'asc';
// make combo attribute
if (att !== 'dist') {
list.each(function(){
// attr value = 1 means true, so assign it as a zero
// attr value = 0 means false, so assign it as a nine
// these numbers + distance, makes sure the lower
// values are sorted first
combo = $(this).attr(att) === '1' ? '0' : '9';
$(this).attr('combo', combo + $(this).attr('dist'));
});
att = 'combo';
}
list.tsort('',({order:order,attr:att}));
};
// Sort by favorite:
$('button:contains(Fav)').click(function(){ sortit(this, 'myfav'); });
// Sort by favorite:
$('button:contains(Been)').click(function(){ sortit(this, 'beenthere'); });
// Sort by default
$('button:contains(Dist)').click(function(){sortit(this, 'dist'); });