Accessing parent context in Meteor templates and template helpers

前端 未结 9 650
别跟我提以往
别跟我提以往 2020-12-09 01:10

I\'m running into a template context situation that I\'m having a hard time finding a way around.


Here\'s the template in question:



        
相关标签:
9条回答
  • 2020-12-09 01:27

    {{#each parent}}

    {{#each child}}

    <input type="hidden" name="child_id" value="{{_id}}" />

    <input type="hidden" name="parent_id" value="{{../_id}}" />

    {{/each}}

    {{/each}}

    The _id is NOT the _did of the thing, it's the id of the parent!

    0 讨论(0)
  • 2020-12-09 01:31

    It's not particularly pretty, but I've done something like this:

    <template name='forLoop'>
    {{#each augmentedParticipants}}
    {{> participant }}
    {{/each}}
    </template>
    
    <template name='participant'>
    ...
    Question: {{this.parent.question}}
    ...
    </template>
    
    
    // and in the js:
    Template.forLoop.helpers({
        augmentedParticipants: function() {
            var self = this;
            return _.map(self.participants,function(p) {
                p.parent = self;
                return p;
            });
        }
    });
    

    It's similar to the approach that AVGP suggested, but augments the data at the helper level instead of the db level, which I think is a little lighter-weight.

    If you get fancy, you could try to write a Handlebars block helper eachWithParent that would abstract this functionality. Meteor's extensions to handlebars are documented here: https://github.com/meteor/meteor/wiki/Handlebars

    0 讨论(0)
  • 2020-12-09 01:31

    It's a long shot, but maybe this could work:

    {{#with ../}}
      {{#each options}}
        {{this}}
      {{/each}}
    {{/with}}
    
    0 讨论(0)
  • 2020-12-09 01:31

    This should make life easier.

    // use #eachWithParent instead of #each and the parent._id will be passed into the context as parent.
    Handlebars.registerHelper('eachWithParent', function(context, options) {
    
        var self = this;
        var contextWithParent = _.map(context,function(p) {
            p.parent = self._id;
            return p;
        });
    
        var ret = "";
    
        for(var i=0, j=contextWithParent.length; i<j; i++) {
            ret = ret + options.fn( contextWithParent[i] );
        }
        return ret;
    });
    

    Go ahead and change

    p.parent = self._id;
    

    to whatever you want to access in the parent context.

    Fixed it:

    // https://github.com/meteor/handlebars.js/blob/master/lib/handlebars/base.js
    
    // use #eachWithParent instead of #each and the parent._id will be passed into the context as parent.
    Handlebars.registerHelper('eachWithParent', function(context, options) {
        var self = this;
        var contextWithParent = _.map(context,function(p) {
            p.parent = self._id;
            return p;
        });
    
        return Handlebars._default_helpers.each(contextWithParent, options);
    });
    

    This works :) with no error

    0 讨论(0)
  • 2020-12-09 01:33

    "click .selected":function(e){
        var parent_id = $(e.currentTarget).parent().attr("uid");
        return parent_id
      },
    <td id="" class="staff_docs" uid="{{_id}}">
                                            {{#each all_req_doc}}
                                                    <div class="icheckbox selected "></div>
      {{/each}}
      </td>

    0 讨论(0)
  • 2020-12-09 01:34

    It seems since Spacebars (Meteor's new template engine), you have access to the parent context within {{#each}} blocks using ../.

    In Meteor 0.9.1, you can also write a helper and use Template.parentData() in its implementation.

    0 讨论(0)
提交回复
热议问题