I'm new in node.js and Jade.
I searched for solutions without success (maybe I asked wrong questions in google, I don't know).
I want to create table rows in each
loop in Jade. The thing is that after every 3rd td
I want insert new tr
. Normally it's quite simple but with Jade I simply can't achieve that.
table
thead
tr
td Header
tbody
each item, i in items
if (i % 3 === 0)
tr
td
a(href="#{baseUrl}/admin.html?id=#{item.id}")
I know that something is wrong with my if
statement. I tried many configurations without luck. I'm sure that it will be quite easy issue.
Thanks in advance for help!
Based on @Laurent Perrin answer I modified a little my code. Now it creates tr
, then 3 td
and then new tr
so it's a little closer...
if (i % 3 === 0)
tr
td: a(href="#{baseUrl}/admin.html?id=#{item.id}") dsdsd #{i}
<tr></tr>
<td><a href="...">0</a></td>
<td><a href="...">1</a></td>
<td><a href="...">2</a></td>
<tr></tr>
EDIT: this code should do what you want, but it's not very elegant:
table
thead
tr: td Header
tbody
- for(var i = 0, nbRows = items.length/3; i < nbRows; i++) {
tr
if items[3*i]
td: a(href="#{baseUrl}/admin.html?id=#{items[3*i].id}")
if items[3*i + 1]
td: a(href="#{baseUrl}/admin.html?id=#{items[3*i + 1].id}")
if items[3*i + 2]
td: a(href="#{baseUrl}/admin.html?id=#{items[3*i + 2].id}")
- }
What you could do instead is tweak your model to make it more Jade-friendly, by grouping items by rows:
function getRows(items) { return items.reduce(function (prev, item, i) { if(i % 3 === 0) prev.push([item]); else prev[prev.length - 1].push(item); return prev; }, []); }
This will turn:
[{id:1},{id:2},{id:3},{id:4},{id:5}]
into:
[ [{id:1},{id:2},{id:3}], [{id:4},{id:5}] ]
Then your jade code becomes much simpler:
table thead tr: td Header tbody each row in rows tr each item in row td: a(href="#{baseUrl}/admin.html?id=#{item.id}")
An example of jade + bootstrap, each 4 elements(columns) one row, and the rows goes inside the row.
```
- var i = 0
- var itens_per_line = 4
each order in viewBag.orders
- if (i % itens_per_line === 0 || i === 0) {
.row
- }
.col-md-3.column
p #{order.number}
- i++
```
Here is what I did for a single array (e.g. ['1','2','3','4']) to convert it into two values per row, it could be adjusted for 3.
(mixins are templates in Jade/Pug)
mixin mInput
div.form-group.col-md-6
p=oval
- var valcounter = 0
- var row = [];
each val in JSON.parse(formvalues)
if(valcounter % 2 === 0)
- var col = [];
- col.push(val)
else
- col.push(val)
- row.push(col)
- valcounter++
each orow in row
div.row
each oval in orow
+mInput
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With