有没有办法根据contentItems对文档进行排序?
我正在渲染每个内容项,如:
{{#each contentItems}}
{{> someTemplate}}
{{/each}}
我想渲染每个按负载位置排序的。有没有办法用嵌入式文档(contentItems)做到这一点?
{
"_id" : "sYKXwp27o2MCBtPsN",
"contentItems" : [
{
"_id" : "NwsWpu3dqj7jByLkq",
"position" : 0.75,
"title" : "Nested animations in AngularJS using ui-router"
},
{
"_id" : "Rve9R5uJzvrbgfrrX",
"title" : "AngularJS Data Models: $http VS $resource VS Restangular",
"position" : 1
},
{
"_id" : "BNq9Fe9gdYJ6Wgoym",
"position" : 0.875,
"title" : "Random title? Nope it's static."
}
],
"title" : "Some title"
}
澄清一下:我希望能够按位置值对contentItems进行排序,而不是按文档本身的顺序排序。这可能吗?
答案 0 :(得分:2)
您可以迭代对其进行排序的帮助程序的结果。例如:
{{#each sortedContentItems}}
{{> someTemplate}}
{{/each}}
sortedContentItems
的样子:
Template.myTemplate.helpers({
sortedContentItems: function() {
return _.sortBy(this.contentItems, 'position');
}
});
如果你想要颠倒排序,你可以这样做:
Template.myTemplate.helpers({
sortedContentItems: function() {
return _.sortBy(this.contentItems, function(ci) {
return -ci.position;
});
}
});
答案 1 :(得分:1)
向David Weldon's answer添加一点,这可能是使用集合转换函数的好例子。根据Meteor文档:
如果为Collection或其任何检索方法指定转换选项,则在返回或传递给回调之前,文档将通过transform函数传递。这允许您从其数据库表示中添加方法或以其他方式修改集合的内容。您还可以指定特定查找,findOne,允许或拒绝调用的转换。
因此,您可以通过在find
或findOne
方法中传递转换选项来在帮助程序中进行排序,以检索文档。像这样:
{{#each sortedContentItems}}
{{> someTemplate}}
{{/each}}
Template.page.helpers({
sortedContentItems: function () {
var item = Items.findOne({}, {
transform: function (doc) {
doc.contentItems = _.sortBy(doc.contentItems, 'position');
return doc;
}
});
return item && item.contentItems;
}
});
我写了一个test in meteorpad,你可以在其中看到它。