【发布时间】:2014-09-04 01:28:19
【问题描述】:
使用 Meteor 0.8.x
我正在尝试用集合中的两列文档填充模板。一栏一半,另一栏一半。我能想到的最好的办法是遍历集合两次,每边一次,并使用索引或计数器来跟踪偶数/奇数。空格键没有@index 或@even @odd。在 stackoverflow 和 ggroup 中对此进行了多次讨论,但我不确定如何在我自己的帮助程序中正确执行此操作。
试过这个模板:
<div class="row">
<article>
{{#each post}}
{{#if oddCounter}}
{{> templatePost}}
{{/if}}
{{/each}}
</article>
<article>
{{#each post}}
{{#if evenCounter}}
{{> templatePost}}
{{/if}}
{{/each}}
</article>
</div>
使用这些助手:
var evenPost = 0;
var oddPost = 0;
Template.dashboard.helpers({
evenCounter: function () {
return (evenPost++ % 2 === 0);
},
oddCounter: function () {
return !(oddPost++ % 2 === 0);
},
posts: function () {
return Posts.find();
}
});
首先,这看起来很粗糙,并且最初确实有效。但它实际上有一个缺陷,即每当更改文档并重新绘制模板(templatePost)时,它会迭代oddCounter / evenCounter变量并将项目移动到另一列。不知道如何解决。
我计算每个帖子的方法是否完全有缺陷?
你能重构它以防止 Meteor 在重绘时递增吗?
也许使用自定义的 .map 和光标函数来为客户端的集合添加索引? (在Discover Meteor book 看到这个,但无法正常工作)。
谢谢!
更新 1:D 先生的解决方案有效,但我能够从动画章节获得 Discover Meteor example 并坚持使用它。
Template.dashboard.helpers({
posts: function () {
var index = 0;
var posts = Posts.find();
return posts.map(function(post, index, cursor) {
post._index = index++;
return post;
});
},
even: function () {
return (this._index % 2) === 0;
}
});
更新 2:为了减少几行代码,删除奇数计数器并在模板中使用 {{#unless even}} 来跟踪奇数文档。
【问题讨论】:
-
这似乎是一个用 CSS(而不是代码)更容易解决的问题。只需将所有物品放入一个容器中,并确保它们适合两个宽。它甚至还有
:even和:odd伪选择器,用于对两列中的元素进行样式设置。
标签: javascript meteor meteor-blaze