简体   繁体   中英

meteor: render a template in a specific context

I have two templates

<body>
    {{>tmpl1}}
    {{>tmpl2}}
    ....
</body>

in the tmpl1 I have a list of items, which can be clicked. When one is click, tmpl2 shown the details. How can this be achieved ?

So, just to make the idea clearer, here is how I get the list of items

Template.tmpl1.items = function () {
    return Items.find({}).fetch();
};

tmpl1 displays them as follows

<template name="tmpl1">
    {{#each items}}
        {{title}}
    {{/each}}
    ....
</template>

So tmpl2 template might look like this

<template name="tmpl1">
    <h1>{{title}}</h1>
    <p>{{content}}</p>
</template>

Any suggestions how to link the selected item in tmpl1 with tmpl2 ?

First, put your templates in a container so that you can manipulate the context. Also, put the details template in a #with context:

<template name="box">
  {{> list}}
  {{#with item}}
    {{> details}}
  {{/with}}
</template>

Now, add the event handlers for the box template. Assuming your entries in the list looks like this:

<div class="listItem" data-id="{{_id}}">{{title}}</div>

Write the handler:

Template.box.events({
  'click .listItem': function(e, t) {
    t.data.itemId = $(e.target).data('id');
    t.data.itemDep.changed();
  }
});

Finally, create the data helper and dependency for the selected item:

Template.box.created = function() {
  this.data.itemDep = new Deps.Dependency();
};

Template.box.item = function() {
  this.itemDep.depend();
  return Items.findOne(this.itemId);
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM