Change Body Class Based On URL in Meteor

前端 未结 2 1907
臣服心动
臣服心动 2021-01-07 04:03

I have a template named layout in my app. Inside has:


Basically what I want to ach

相关标签:
2条回答
  • 2021-01-07 04:13

    I too needed this feature and found the same issue as @phocks in that {{klass}} only works inside and not on the body tag. I'm new at Meteor but here's my approach that just uses some jQuery:

    Template.body.onRendered(function(){
        var instance = this;
        instance.autorun(function() {
            FlowRouter.watchPathChange();
            var context = FlowRouter.current();
            // this does the trick, below
            $('body').attr('class', '').addClass(context.route.name);   
    
            // this is just to do more CSS stuff if they're logged in
            if(Meteor.userId()){
                $('body').addClass('logged-in');   
            } else {
                $('body').removeClass('logged-in');   
            }
        });
    });
    

    I use this in a body.js file, and this code relies on FlowRouter. On path changes, I get the name I declared for the route, remove any previous route names from the body tag, then add the current route's name.

    As a small side note, I also add a class of logged-in to the body for authenticated users, so that's what the bottom few lines are doing.

    0 讨论(0)
  • 2021-01-07 04:22

    You shold modify DOM elememts in onRendered like this:

    Template.layout.onRendered(function() {
      // get the current route name (better than checking window.location)
      var routeName = Router.current().route.getName();
    
      // add the class to body if this is the correct route
      if (routeName === 'myRoute')
        $('body').addClass('blue');
    });
    
    Template.layout.onDestroyed(function() {
      // remove the class to it does not appear on other routes
      $('body').removeClass('blue');
    });
    

    An alternative (and probably easier) solution is just to use a helper on your body template:

    Template.body.helpers({
      klass: function() {
        if (Router.current().route.getName() === 'myRoute') {
          return 'blue';
        }
      }
    });
    

    Then your body could look like this:

    <body class="{{klass}}"></body>
    
    0 讨论(0)
提交回复
热议问题