【问题标题】:Meteor - Accessing DOM elements from another template events handlerMeteor - 从另一个模板事件处理程序访问 DOM 元素
【发布时间】:2015-05-24 04:30:17
【问题描述】:

大家下午好。

当我转到包含通过通知的评论的页面时,我正在尝试为评论项目着色。 - 如 fb 或堆栈溢出。

除了我上面提到的部分之外,我一切正常。

通知事件

Template.notification.events({
    'click a':function() {
        var commentTemplate = this.commentId;
        console.log(commentTemplate);    //Target commentId returns successfully

        //Code here needed 
        //to color comment when page moves to
        //coresponding page.
   }        

Template.commentList

//HTML
{{#each comments}}
    {{> commentItem}}
{{/each}}

//JS
comments: function(){
    return Comments.find({postId:this._id});
}

我也尝试使用this._id通过console.log获取相应的commentItem的id。

所以我想知道的是,

有没有办法从通知链接this.commentId 并使用相应的_id 访问<template name = "commentItem">。然后使用.addClass之类的东西来操纵它的element/dom

请把我推向正确的方向!

【问题讨论】:

    标签: javascript jquery mongodb meteor meteor-blaze


    【解决方案1】:

    如果我理解正确,当您单击通知模板中的链接时,您想将用户带到 commentList 页面,然后操作引用评论的 CSS?可能有几种方法可以做到这一点。

    第一步是确保您有办法在页面加载后选择特定的 DOM 元素。为此,在您的 commentItem 模板中,您可能会执行以下操作:

    <template name='commentItem'>
      <div class='commentItem' id='comment-{{_id}}'>
        ....
      </div>
    </template>
    

    如果您使用iron:router,一种快速简便的方法(但不是特别可靠的方法)是手动重定向到commentList页面,然后在事件处理程序中执行您的操作页面已呈现:

    Template.notification.events({
      'click a':function(event) {
        event.preventDefault(); // don't let this take you anywhere
        var commentTemplate = this.commentId;
        Router.go($(event.currentTarget).attr('href'));
        setTimeout(function() { 
          $('#comment-' + commentTemplate).addClass('whatever-class-you-want');
        }, 500); // need to wait for the page to render first -- this is probably not a robust method
      }
    });   
    

    一个更强大的选项可能是在 URL 中添加一个可选的 referrer 参数(即,让链接类似于 &lt;a href="{{pathFor commentsPage query='referrer=[comment _id]'}}"&gt;...&lt;/a&gt;,其中 [comment _id]替换为相关评论的 _id),然后在您的commentList 模板中,一旦您的页面呈现,您就可以查看是否有引荐来源网址,如果有,请更改 CSS:

    Template.commentList.rendered = function() { 
      var referrer = Router.current().params.query.referrer;
      if (referrer) { 
        $('#comment-' + referrer).addClass('whatever-class-you-want');
      }
    }
    

    【讨论】:

    • 你是我的救星和天才,我从中学到了很多。唯一的问题是,当我使用第一种方法时,它不会将类添加到#id。我必须再次点击通知才能添加课程。
    • 我在第一个方法的最后一行添加了一个 setTimeout。但我不知道这是否是一个好方法。
    • 现在我有一个帮助href返回Router.routes.postPage.path({_id: this.postId});。我想尝试使用第二种方法。从那时起,即使刷新,它也会显示通知突出显示。而且我不必使用 setTimeout。我将如何在pathFor 的助手中传递这个Router.routes.postPage.path({_id: this.postId}); 数据?
    • @SangYooKim 我认为你是对的,第一种方法需要等待页面渲染才能添加类,这意味着你必须使用 setTimeout,这是不可靠的。我应该在第二点更清楚——'[comment _id]' 我的意思是获取评论的任何 _id 并在那里使用它,所以在页面上显示的最终结果看起来像 http://localhost:3000/posts/YwhbHP6d4gkv785KN?referrer=AbCdEfGhIJkLmNoPq ,但您也可以使用哈希而不是查询来完成。
    • 哈希通常是指 URL 提供的较大文档的一部分;例如,滚动到锚点:http://myapp.com/#myanchor。另一方面,当您必须从数据库中提取某些内容或以其他方式在页面上显示不同信息时,通常会使用参数(例如,?referrer=);用 Meteor 术语粗略地说,它以某种方式为您的页面指定数据上下文。你可以在这里阅读更多关于哈希的信息:en.wikipedia.org/wiki/Fragment_identifiermattcutts.com/blog/seo-glossary-url-definitionsstackoverflow.com/questions/22267136
    猜你喜欢
    • 1970-01-01
    • 2015-10-31
    • 2017-08-24
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多