繁体   English   中英

从模板事件回调内部调用模板帮助器函数

[英]calling a template helper function from inside a template event callback

我对流星很陌生,可能我完全不正确地进行了处理。

我有一个代表菜单栏的简单模板。 当用户单击图标时,菜单应该会出现。 当他们再次单击它时,它应该消失了。

这是标记:

<template name="menu">
  <div class="menu">
    <div class="toggler">
      <i class="fa fa-bars fa-3x"></i>
    </div>
    <div class="menu-body">
       <!-- ... -->
    </div>
  </div>
</template>

这是我拥有的JS:

Template.menu.helpers({
    self: Template.instance(),
    menu_body: self.find('.menu-body'),
    toggler: self.find('.toggler'),

    currently_open: false,
    open: function() {
        menu_body.style.display = 'flex';
    },
    close: function() {
        menu_body.style.display = 'none';
    },
    toggle: function() {
        if(currently_open) close();
        else open();
    }
});

Template.menu.events({
    'click .toggler': function(event, template) {
        console.log(template);
        template.toggle();
    }
});

我以为模板实例可以访问辅助函数,但是根据log语句,这是模板实例的组成部分:

B…e.TemplateInstance {view: B…e.View, data: null, firstNode: div.menu, lastNode: div.menu, _allSubsReadyDep: T…r.Dependency…}
  _allSubsReady: false
  _allSubsReadyDep: Tracker.Dependency
  _subscriptionHandles: Object
  data: null
  firstNode: div.menu
  lastNode: div.menu
  view: Blaze.View
  __proto__: Blaze.TemplateInstance

有人可以在这里指出我正确的方向。 如果我做错了,请随时进行仔细检查。

助手用于功能调用-不是事件驱动的作品。

流星具有事件句柄,可用于跟踪诸如点击之类的事件。 您也可以使用CSS类很好地定义样式,而无需以编程方式覆盖它们。

Template.name.events({
'click .menuToggler': function(event, template) {
  event.preventDefault();
  var menu = template.find('.menu-body'); //(make this in ID!)
  if($(menu).hasClass('menuOpen')) {
     $(menu).removeClass('menuOpen');
     //menu.style.display = 'none';
  } else {
     $(menu).addClass('menuOpen');
     //menu.style.display = 'flex'; Use css to define these on the menuOpen class
  }
});

注意事项:此事件句柄假定您的菜单主体类在本例中的“名称”模板下可用。 因此,您将希望此事件处理程序位于您拥有的最高级模板中。 它也假设。

如果要在模板的各个组件(助手,事件回调等)之间共享状态,则应通过直接在模板实例上设置属性来完成。

这可以通过onCreated()回调来完成

根据文档:

在第一次评估模板的逻辑之前,将调用此方法添加的回调。 在回调内部, this是新的模板实例对象。 您在此对象上设置的属性将从通过onRendered和onDestroyed方法添加的回调以及事件处理程序中可见。

这些回调将触发一次,并且是要触发的第一组回调。 处理创建的事件是在模板实例上设置值的有用方法,这些值是使用Template.instance()从模板助手中读取的。

因此,提供一个比我原始问题中的示例更为相关和简洁的示例。

Template.menu.onCreated(function() {
  this.items =  [
    {title: 'Home',    icon: 'home'},
    {title: 'Profile', icon: 'user'},
    {title: 'Work',    icon: 'line-chart'},
    {title: 'Contact', icon: 'phone'}
  ];
});

Template.menu.helpers({
  items: function() {
    var self = Template.instance();
    return self.items;
  }
});

Template.menu.events({
  'click .toggler': function(event, template) {
    console.log(template.items); //[Object,Object,Object,Object]
    //do something with items
  }
});

这实际上很有趣,但是我创建了一个迷你包来帮助您做到这一点: https : //atmospherejs.com/voidale/helpers-everywhere

但是对于您而言,这不是正确的方法。 我可以看到你想要添加的显示器无论是flexnone ,最好添加CSS元素一样active持有display: flex ,并添加active或删除其上点击这样的: $('').addClass('active') or $().removeClass('active')

一个班轮也可以在这里工作: $('.menu-body').toggleClass('active')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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