我如何以编程方式 show/hide 作为 Meteor 主体模板一部分的按钮?

How can I programatically show/hide a button that is part of the body template in Meteor?

我正在使用 Meteor 应用程序中的 Template.dynamic 功能。显示的初始模板是主要模板,并且通常用户会希望从他们移动到的任何模板立即返回到它。我想通过 "go back" 按钮使这种返回 initial/chief 模板的能力非常明显。

让我先概述一下我是如何更换模板的:

  Template.mnuScheduler.events({
    "click #mniOpenExisting": function () {
      Session.set('curTemplate', 'scheduleOpenExisting');
    },

  Template.body.helpers({
    currentTemplate: function () {
      return Session.get('curTemplate');
    }
  });

  <div class="container">
    {{> mnuScheduler}}
    {{> Template.dynamic template=currentTemplate}}

我不希望 'go back' 按钮在主模板上可见,因为不需要返回到它本身。

我可以在每个模板的底部放置这样一个 'go back' 按钮,然后在每个模板的 OnRendered 事件中显示它:

$('btnBack').removeClass('hide');

...其中 CSS class 是:

.hide {
  visibility: hidden;
  display: none;
}

...但是这里必须有一种方法来实现 DRY 原则,而不是在每个模板上复制一个 'go back' 按钮。

起初我想如果我把 "back button" 放在正文中,像这样:

main.html:

<body>

  <div class="container">
    {{> mnuScheduler}}
    {{> Template.dynamic template=currentTemplate}}    
    {{> backButton}}
  </div>

</body>

<template name="backButton">    
    <div>
        <button class="hide" type="button" id="btnGoBack" name="btnGoBack">Go Back</button> 
    </div>
</template>

...我可以在换出模板的地方添加这样的代码:

  Template.mnuScheduler.events({
    "click #mniOpenExisting": function () {
      Session.set('curTemplate', 'scheduleOpenExisting');
      $('btnBack').removeClass('hide');      
    },

...但是 'btnBack' 不是 'mnuScheduler' 模板的一部分,因此 'btnBack' 在那里无法识别。

如果我只将后退按钮放在一个地方('body' 模板),我可以从另一个模板的事件中引用它吗?有没有办法做这样的事情:

  Template.mnuScheduler.events({
    "click #mniOpenExisting": function () {
      Session.set('curTemplate', 'scheduleOpenExisting');
      Template.body.$('btnBack').addClass('hide');      
    },

?

更新

我想我在尝试实施 Michael Floyd 的建议时做错了什么。

主模板(最初显示的那个)是"tblScheduler"。这是我添加的内容:

// main.html:

<body>
  <div class="container">
    {{> mnuScheduler}}
    {{> Template.dynamic template=currentTemplate}}
    {{#unless isChiefTemplate}}
      <button type="button" id="btnDisplayScheduleTemplate" name="btnDisplayScheduleTemplate">Display Schedule</button>
    {{/unless}}
    {{> footer}}
  </div>

</body>

// main.js:

Template.tblScheduler.helpers({
  jobLocations: function() {
    return JobLocations.find({}, {sort: {jl_jobloc: 1}, fields: {jl_jobloc: 1}});
  },
  isChiefTemplate: function() {
    return true;
  },
  . . .

Template.body.events({
  'click #btnDisplayScheduleTemplate': function() {
    Session.set('curTemplate', 'tblScheduler');
  }  
}); // Template.body.events({

但是 "Display Schedule" 按钮在主模板 (tblScheduler) 上仍然可见。

注意:"body" 事件有效 - 单击按钮确实会从任何其他模板切换到主模板 (tblScheduler);只是即使 主模板上也可以看到该按钮,这仍然是问题所在。

只需将后退按钮放在主模板上,但用

保护它
{{#unless isMainPage}}
  <button class="hide" type="button" id="btnGoBack" name="btnGoBack">Go Back</button>
{{/unless}}

您只需要一个 isMainPage 帮手。由于 null 是假的,你甚至可以只为你的主模板编写那个帮助器并让它 return true:

Template.main.helpers({
  isMain: function(){ return true; }
});

这样:

  1. 它会自动出现在每一页上
  2. 它的事件处理程序可以只在主模板上

在 Template.tblScheduler.helpers 中定义助手不起作用,因为您从 body template:

调用它

要么像这样创建一个全局模板:

Template.registerHelper('isChiefTemplate', function(){
  return Session.get('curTemplate') === 'tblScheduler';
})

或在正文模板中定义:

Template.body.helpers({
  isChiefTemplate:  function(){
    return Session.get('curTemplate') === 'tblScheduler';
  },
});

以及您的 update/Michel 弗洛伊德回答的模板:

{{#unless isChiefTemplate}}
  <button type="button" id="btnDisplayScheduleTemplate" name="btnDisplayScheduleTemplate">Display Schedule</button>
{{/unless}}