【问题标题】:Access HTML after this.render() in Iron Router在 Iron Router 中的 this.render() 之后访问 HTML
【发布时间】:2015-10-17 01:59:05
【问题描述】:

我需要在新渲染的模板上应用一些语义 UI,但我不知道如何从路由器获取渲染的 HTML。这是我的代码:

Router.route('/', {
  name: 'home',

  where: 'client',

  action: function () {

    this.render('home');
  },

  onAfterAction: function () {

    console.log( $('#homeSidebar') );

  }

});

基本上,$('#homeSidebar') 应该返回侧边栏元素,但它什么也不返回,因为 HTML 尚不可用。到目前为止,唯一的解决方案是像这样更改函数

  onAfterAction: function () {
    setTimeout(function () {
      $('#homeSidebarToggle').on('click', function () {
        $('#homeSidebar').sidebar('toggle');
      });
    }, 200);    
  }

既不干净也不安全。如何在 HTML 可用后立即运行函数?

【问题讨论】:

    标签: jquery meteor iron-router semantic-ui


    【解决方案1】:

    您可以查看tracker.afterFlush 来安排代码在处理完所有无效计算后运行。

    但是,您的具体示例看起来像是 jQuery 开发人员进入 Meteor 并直接应用 jQuery 模式的常见情况。通常在 Meteor 中有更简单的方法。

    将事件处理程序附加到模板的更简单和更好的方法是使用template events。在你的情况下:

    Template.home.events({
      'click #homeSidebarToggle': function(ev){
        $('#homeSidebar').sidebar('toggle');
      }
    });
    

    【讨论】:

      【解决方案2】:

      您应该在模板上使用onRendered 回调。 Meteor 使用模板helpers, events and callbacks 来操作 DOM。 Iron Router 仅用于路由)
      您的客户/view.html:

      <template name="home">
        <div id="homeSidebar">
      
        </div>
      </template>
      

      您的客户/view.js:

      Template.home.onRendered(function () {
        console.log($('#homeSidebar'));
      });
      

      【讨论】:

      • 谢谢,但我不能对此表示赞同,因为我认为您的回答不完整。如果我在问问题,那是因为我已经阅读并首先尝试了一些事情,并且感到困惑,我期待得到彻底的答案。首先,onRendered,我在哪里使用它?此外,在这种情况下,“阅读文档”不是答案。
      • 谢谢!通过这个例子,onRendered 似乎正是我所需要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多