Javascript 未使用Meteor将变量正确呈现为HTML(可能是数据上下文问题)

Javascript 未使用Meteor将变量正确呈现为HTML(可能是数据上下文问题),javascript,html,meteor,meteor-blaze,Javascript,Html,Meteor,Meteor Blaze,我试图在我的网页上创建一个链接,链接到每个用户的帖子。我已经成功地为每个帖子创建了新页面(message.html)(该网页的“Hello World”显示正确,请参见下文)。然而,与我的主页相反,我想要呈现到HTML中的变量无法显示。提前谢谢 注: 路由是用Flow Router完成的 以下是相关的代码片段: Message.js(或html的控制器) Message.html(或打开新页面时显示的html) 注意:此html中的Hello World是一个可以在浏览器中有效显示的示例 <

我试图在我的网页上创建一个链接,链接到每个用户的帖子。我已经成功地为每个帖子创建了新页面(message.html)(该网页的“Hello World”显示正确,请参见下文)。然而,与我的主页相反,我想要呈现到HTML中的变量无法显示。提前谢谢

注: 路由是用Flow Router完成的

以下是相关的代码片段:

Message.js(或html的控制器)

Message.html(或打开新页面时显示的html)

注意:此html中的Hello World是一个可以在浏览器中有效显示的示例

<template name="ApplicationLayout2">
Hello World
    {{> boostPage}}
</template>

<template name="boostPage">
    {{#with messages}}
    <h2>Boost: {{text}}</h2>
    <q class="message">{{message}}</q>
    {{/with}}
</template>
<template name="Message">
Hello World
    {{#with message}}
    <h2>Boost: {{text}}</h2>
    <q class="message">{{message}}</q>
    {{/with}}
</template>
Routes.js

编辑#1我包括了zim建议的更正

Message.js(或html的控制器)

Message.html(或打开新页面时显示的html)

注意:浏览器中会显示Hello World和Boost:标题以及引号之间包围的对象

<template name="ApplicationLayout2">
Hello World
    {{> boostPage}}
</template>

<template name="boostPage">
    {{#with messages}}
    <h2>Boost: {{text}}</h2>
    <q class="message">{{message}}</q>
    {{/with}}
</template>
<template name="Message">
Hello World
    {{#with message}}
    <h2>Boost: {{text}}</h2>
    <q class="message">{{message}}</q>
    {{/with}}
</template>
Routes.js

在本出版物中:

  Meteor.publish('messages', function messagesPublication() {
    return Boosts.find({
        {_id: this._id},
    });
  });
。。。您希望“this.\u id”代表什么?你把它记录到控制台了吗?我怀疑它没有定义

更新:

假设您有这样一条路径:/message/:messageid

您可以有一个这样的消息模板:

Message.html:

<template name="Message">
    {{#with message}}
      {{content}}    <!-- or some field within message -->
    {{/with}}
</template>
这是一个简单的模板,用于获取单个消息的数据并显示它。现在,您需要发布一条消息:

server.js:

  Meteor.publish('message', function(messageId) {
    return Boosts.find({_id: messageId});
  });
  Meteor.publish('messages', function() {
    return Boosts.find();
  });
这是一种方法。注意流程:路由器定义消息的id,模板订阅消息,通知服务器发布消息,然后助手对发布的数据进行查找

您还可以创建一个在消息中循环的模板。在这里,我们订阅所有消息数据,并将其全部发布。(注意我是如何用单数和复数来命名事物的,以帮助传达这个概念)

Messages.html:

<template name="Messages">
    {{#each message in messages}}
      {{message.content}}    <!-- or some field within message -->
    {{/each}}
</template>
这将发布所有数据:

server.js:

  Meteor.publish('message', function(messageId) {
    return Boosts.find({_id: messageId});
  });
  Meteor.publish('messages', function() {
    return Boosts.find();
  });
在本例中,我们不是从路由中提取任何信息,而是循环遍历所有消息


这有帮助吗?

您在浏览器控制台上看到任何错误吗?一点也没有,这让我感到困惑。我只有经典的“DevTools未能解析SourceMap:”我已经学会忽略它。不,我没有将它记录到控制台。我希望它返回单击的boost(post)的id;我希望返回的_id依赖于用户单击的boost,以便message.html可以显示与所讨论的boost相关的消息。@Lesscomfortable,发布不会知道客户端上发生了什么,除非您1)发布所有内容并在客户端上为单击的项执行find(),或者2)将单击内容的id传递给发布,让它发布,并在数据到达后执行find()。在(1)中,您的意思是在订阅中执行find()?(订阅邮件在messages.js中,它被导入到client文件夹中的client.js中)。如果是这样,我如何在订阅之前编辑数据?我这样问是因为到目前为止,我一直直接订阅我发布的任何内容,所以我不太习惯在订阅中编辑。很抱歉,如果这听起来很愚蠢,我仍然在努力正确理解Meteor。@Lesscomfortable,检查我的答案,我添加了一些处理单个和多个消息的示例代码。应该让你走上正确的道路。
  Meteor.publish('message', function(messageId) {
    return Boosts.find({_id: messageId});
  });
<template name="Messages">
    {{#each message in messages}}
      {{message.content}}    <!-- or some field within message -->
    {{/each}}
</template>
Template.Messages.onCreated(function() {
    // subscribe to all the messages
    this.subscribe('messages');
});

Template.Messages.helpers({
    // get data for all the messages
    messages() {
        return Boosts.find();
    }
});
  Meteor.publish('messages', function() {
    return Boosts.find();
  });