What is the proper way to manipulate template instance in Meteor framework?

前端 未结 2 1907
Happy的楠姐
Happy的楠姐 2021-01-15 13:14

I am new to Meteor and wondering how to solve what seems to me is a common problem.

Let\'s say I have a handlebars template listing restaurants:

<         


        
2条回答
  •  清酒与你
    2021-01-15 13:38

    I almost always avoid Session. I think it pollutes the global scope. Also it prevents you from running multiple instances of the template. I recommend using a reactiveVar or reactiveDict scoped to the template instance. Thanks to Rahul for starting a demo project. I took his example and modified it to show my recommended approach.

    attach a reactiveDict to the template instance onCreate. Use this to store state instead of global Session var!

    Template.Restaurants.onCreated(function() {
      this.state = new ReactiveDict;
      this.state.set('currentRestaurant', null); // could set a init value here
    });
    

    this event handler will set the state of the reactiveDict on click

    'click': function(e, t) {
        t.state.set('currentRestaurant', this._id);
    }
    

    this helper is used to show/hide the menu template

    currentRestaurant: function() {
    // check whether this restaurant is selected. "this" refers to the current
    // context, eg. the current restaurant in the loop
    return Template.instance().state.equals("currentRestaurant", this._id);
    },
    

    menu template receives the selected id from data context instead of from Session

    
    
    
    

    added this helper just to show we really got the id

    Template.menuItems.helpers({
      restaurantName: function() {
        var restaurantMenu = Restaurants.findOne(this.restaurant);
        return restaurantMenu.name;
      },
    })
    

    Posted a fully working project to github. https://github.com/white-rabbit-japan/scopedReactivityDemo

    App is hosted on meteor.com http://scopedreactitivydemo.meteor.com/

提交回复
热议问题