javascript获取已呈现的Mongo字段的值-Meteor

javascript获取已呈现的Mongo字段的值-Meteor,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,大家好,非常感谢你们的帮助。问题根据评论中的建议进行编辑 我是Mongo和Meteor的新手 我有一个带有字段“slug”的集合“posts” “post”模板使用每个post的值正确填充。Slug值总是类似于“我的好帖子” 我需要获取_id的slug的文本值,每次访问模板时,该值都会不同,对其进行编码,写入字符串,然后将字符串吐回模板中 尝试过的事情 无法在模板帮助程序或onRendered中返回“this.slug”或“this.data.slug”的值,即使已定义集合并在模板中正确填充空

大家好,非常感谢你们的帮助。问题根据评论中的建议进行编辑

我是Mongo和Meteor的新手

我有一个带有字段“slug”的集合“posts”

“post”模板使用每个post的值正确填充。Slug值总是类似于“我的好帖子”

我需要获取_id的slug的文本值,每次访问模板时,该值都会不同,对其进行编码,写入字符串,然后将字符串吐回模板中

尝试过的事情

  • 无法在模板帮助程序或onRendered中返回“this.slug”或“this.data.slug”的值,即使已定义集合并在模板中正确填充空格键值

  • “此”将“[object]”返回到console.log

  • 当我试图用javascript编码并从助手传递字符串时,应用程序崩溃,可能是因为我没有完全理解文档中的助手语法

(我遵循了评论中的建议,以避免尝试在模板html中创建脚本,因此下面是每个在此线程上提供帮助的人所要求的更多信息)

-模板html-

{{#with post}}

<div class="blog-article">
  <div class="blog-header">
    <div class="left">

      <!-- title -->
      <h1 class="post-title">{{title}}</h1>

      <div class="holder">
        <div class="post-tags">
          <!-- tags -->
           {{#each tags}}
              <span>{{this}}</span>
           {{/each}}
        </div>
      </div>

    </div>

  </div> 

  <div class="blog-post">
    <div class="blog-copy">

      <!-- date -->
      <div class="post-date">{{post_date}}</div>

      <!-- social -->  
      <div class="blog-social">
         <!-- 
               <a class="so-facebook" target="_blank" href="need to encode slug here"></a>
         -->       
       </div>

       <!-- ============== post ============== -->

       {{{content}}}

       <!-- ============ end post ============ -->

     </div>
  </div>
</div>

{{/with}}
Template.post.onCreated(function() {
  var self = this;
  self.autorun(function() {
    var postSlug = FlowRouter.getParam('postSlug');
    self.subscribe('singlePost', postSlug);  
  });
});

Template.post.helpers({

  post: function() {
    var postSlug = FlowRouter.getParam('postSlug');
    var post = Posts.findOne({slug: postSlug}) || {};
    return post;
  } 

   // can't get these working in a helper, out of helper they crash the app 
   // console.log(this.slug);   
   // console.log(this.data.slug);

});

Template.post.onRendered( function () {

   // these do not work 
   // console.log(this.slug);   
   // console.log(this.data.slug);

}); 
db.posts.findOne()

{
  "_id" : ObjectId("576c95708056bea3bc25a91f"),
  "title" : "How Meteor Raised the Bar For New Rapid-Development Technologies",
  "post_date" : "May 28, 2016",
  "image" : "meteor-raised-the-bar.png",
  "slug" : "how-meteor-raised-the-bar",
  "bitlink" : "ufw-29Z9h7s",
  "tags" : [
    "Tools",
    "Technologies"
           ],
  "excerpt" : "sizzling excerpt",
  "content" : "bunch of post content html"
}

如果有人能用任何方法解决这个问题,我会非常高兴和感激地接受答案。

关于流星的一些事情:

您不应该看到这样的模式:

<script type="text/javascript">
...some code
</script>
现在,您的
postdail
模板将自动获得一个与post对象相等的数据上下文,您的助手可以安全地引用此

Template.postDetail.helper({
  slugURI{
    return "/"+encodeURI(this.slug);
  }
});
然后在您的
postdail
模板中,您可以通过以下方式获得编码的slug:

<a class="so-facebook" target="_blank" href={{slugURI}}>

关于Meteor的几件事:

您不应该看到这样的模式:

<script type="text/javascript">
...some code
</script>
现在,您的
postdail
模板将自动获得一个与post对象相等的数据上下文,您的助手可以安全地引用此

Template.postDetail.helper({
  slugURI{
    return "/"+encodeURI(this.slug);
  }
});
然后在您的
postdail
模板中,您可以通过以下方式获得编码的slug:

<a class="so-facebook" target="_blank" href={{slugURI}}>

问题可能在于父模板,而不是此模板。Meteor的工作方式是JS文件与HTML分开,因此不要试图在HTML中包含
标记

首先,您必须将所有文档加载到客户端。(注意:一旦掌握了诀窍,就可以只加载所需的文档)

要做到这一点,您需要一个集合和一个出版物。默认情况下,所有集合都是完全自动发布的,因此,除非您删除了autopublished模块,否则我将假定它仍然处于加载状态

让我们从父模板开始。在本例中,我将循环遍历集合中的所有帖子,并使用innerTemplate显示它们

<template name=parent>
  <ul>
  {{#each post}}
    {{> innerTemplate}}
  {{/each}}
  </ul>
</template>
现在,如果您想在JS文件中使用“slug”,可以执行以下操作:

<template name=innerTemplate>
  <li>{{slug}}</li>
</template>
if(Meteor.isClient) {
  Template.innerTemplate.helpers({
    upperCaseSlug() {
      return this.slug.toUpperCase();
    }
  });
}
然后,您可以在模板中引用
uppercaseslaug
,如下所示:

<template name=innerTemplate>
  <li>{{upperCaseSlug}}</li>
</template>

  • {{UpperCaseSlaug}}

  • 问题可能在于父模板,而不是此模板。Meteor的工作方式是JS文件与HTML分开,因此不要试图在HTML中包含
    标记

    首先,您必须将所有文档加载到客户端。(注意:一旦掌握了诀窍,就可以只加载所需的文档)

    要做到这一点,您需要一个集合和一个出版物。默认情况下,所有集合都是完全自动发布的,因此,除非您删除了autopublished模块,否则我将假定它仍然处于加载状态

    让我们从父模板开始。在本例中,我将循环遍历集合中的所有帖子,并使用innerTemplate显示它们

    <template name=parent>
      <ul>
      {{#each post}}
        {{> innerTemplate}}
      {{/each}}
      </ul>
    </template>
    
    现在,如果您想在JS文件中使用“slug”,可以执行以下操作:

    <template name=innerTemplate>
      <li>{{slug}}</li>
    </template>
    
    if(Meteor.isClient) {
      Template.innerTemplate.helpers({
        upperCaseSlug() {
          return this.slug.toUpperCase();
        }
      });
    }
    
    然后,您可以在模板中引用
    uppercaseslaug
    ,如下所示:

    <template name=innerTemplate>
      <li>{{upperCaseSlug}}</li>
    </template>
    
    
    
  • {{UpperCaseSlaug}}

  • blaze模板应该是空格键-没有脚本标记。javascript应该在.js文件中。流星会把它们结合起来。但我有点搞不懂你到底想干什么。为什么JS需要从模板中读取值?数据应该以另一种方式流动。你能告诉我们你到底想做什么吗?是的,我已经编辑了我的评论。我知道onRendered应该能够获取,例如,“this.slug”(我也尝试了“this.data.slug”)并将输出渲染到console.log,但它就是不起作用。它返回“未定义”。在某个时刻,我确实得到了一个要渲染的值(现在我已经忘记了如何渲染),但是在为新的Mongo_id渲染模板时,该值仍然存在。然后我开始尝试使用模板中的脚本从模板中获取它。。。我正在使用越来越多的黑客策略,但仍然没有运气。完成-看起来“这个”返回“[对象]”。我把这个放在编辑过的问题里。不用担心,我真的很高兴能得到帮助!编辑了这个问题-顺便说一下,这是一篇真正的文章。blaze模板应该是空格键-没有脚本标签。javascript应该在.js文件中。流星会把它们结合起来。但我有点搞不懂你到底想干什么。为什么JS需要从模板中读取值?数据应该以另一种方式流动。你能告诉我们你到底想做什么吗?是的,我已经编辑了我的评论。我知道onRendered应该能够获取,例如,“this.slug”(我也尝试了“this.data.slug”)并将输出渲染到console.log,但它就是不起作用。它返回“未定义”。在某个时候,我确实得到了一个要渲染的值(现在我已经忘记了如何渲染),但是当为新Mongo渲染模板时,该值仍然存在