I don’t understanding of how to structure an app with partials, you know header, footer, and so on. It seems that a very basic and major thing is missing in the tutorials I’ve seen. Or is it just me?
Here are a few pointers, and if you’ll need more I’ll write it up more specifically. Basically what you need to look for is:
-
<template name="footer">
will create a “partial” (if you insist on calling it that; around Meteor I believe we don’t, it’s just another template that can be called/included anywhere) - use it anywhere in another template as
{{>footer}}
- if you want something like a general layout that is included for every page and uses partials like
footer
,header
etc:- use the
iron:router
package, look forlayoutTemplate
in their docs and use it accordingly (basicallyRouter.configure({layoutTemplate:'layout'})
- define a
<template name="layout">
, put{{>header}}
,{{>footer}}
etc where you need them, add a{{>yield}}
where you need your page-specific content to go
- use the
Now you should be good! If you need the partials to be dynamic (at least sometimes), check out iron:router
s regions.
Thanks. What about structure inside the body; wrapper, content, sidebar, and so on? Do I use one single html file for the structure and the rest are templates? How does Meteor knows what to load and where?
There is no layout feature in Meteor core. But there are community packages:
- Iron Router (see @seeekr’s answer)
- Flow Layout
- others?
Meteor basically doesn’t care about files and file names, for templates it only cares for <template name="XXX">
tags, and you can put them wherever in .html
files – 100 templates inside a single file, 1 template per file, or any combination. It simply does not care.
If you want to know what’s currently considered good practice (or one of them):
If you have a very small app you can just put all templates in a single .html
file.
As the app grows you’ll want to spread things out, like create a client/templates
folder and put each template inside its own XXX.html
folder with XXX
being the template name.
What Meteor core does is only what you tell it. Without a package such as iron:router
Meteor just looks for the first body
tag it can find outside of a template definition and renders its content. If it has a call to another template it’ll naturally execute that/include that template as well, but otherwise it won’t.
Now, if you’re using a router package such as iron:router
then you’ll define through means of router configuration which templates will get rendered for which URLs etc. Meteor will still render anything it finds in the first body
tag outside a template definition and output that first and then afterwards whatever the router is supposed to render & output.