Javascript Blaze模板在对象上迭代

Javascript Blaze模板在对象上迭代,javascript,meteor,meteor-blaze,meteor-autoform,Javascript,Meteor,Meteor Blaze,Meteor Autoform,我试图在blaze template meteor中迭代一个对象,在控制台中我可以看到数据,但在模板上什么也看不到。我如何才能让它工作?每个都不工作,arrayify也不工作 此处根据评论添加: {{每个联系人列表} {{name}} {{email}} {{title}} {{phone1}} {{phone2}} {{phone3}} {{/每个}} JS: 联系人列表:函数{ $.ajax{ url:Meteor.absoluteUrl+'contacts/get\u by\u compa

我试图在blaze template meteor中迭代一个对象,在控制台中我可以看到数据,但在模板上什么也看不到。我如何才能让它工作?每个都不工作,arrayify也不工作

此处根据评论添加:

{{每个联系人列表} {{name}} {{email}} {{title}} {{phone1}} {{phone2}} {{phone3}} {{/每个}} JS:

联系人列表:函数{ $.ajax{ url:Meteor.absoluteUrl+'contacts/get\u by\u company/'+Session.get‌​'公司名称', 键入:“GET”, 错误:函数{callback;}, success:functions{console.logres;return res;}, }; }
为了回答您的主要问题,您的模板没有迭代的原因是因为您的contactList函数没有返回任何内容。即使它确实返回了一些东西,由于您的方法,它仍然可能不起作用。不幸的是,解决这个问题的方法不仅仅是添加一个简单的return语句,而是改变整个方法

首先,我强烈建议您从头到尾阅读并遵循这些指南,然后再返回您的项目。 基于您共享的示例代码,很明显您误解了Meteor的大部分基础知识,这是一个遗憾,因为Meteor是一个非常强大和令人愉快的框架。希望,我能帮助澄清一些事情,但在尝试跳入之前,了解流星是如何工作的绝对必要

我在这里看到的最大问题是,您正在定义API端点并从前端使用它们。虽然这在其他框架/技术中是一种相当正常的方法,但在Meteor中,服务器和客户端之间的关系是完全不同的。事实上如此不同,只有一个例子才能证明这种差异

根据您在问题中提供的内容,我重新编写了所有内容,以解释如何在Meteor中实现这一点

首先是模板定义,这里没有真正的变化

<template name="manageContacts">
  <table>
    <thead>
      <tr>
        <th>Name</th>
        <th>Email</th>
        <th>Title</th>
        <th>Phone 1</th>
        <th>Phone 2</th>
        <th>Phone 3</th>
      </tr>
    </thead>
    <tbody>
      {{#each contact in contactList}} 
      <tr class="clickable" name="edit-contact" >
        <td>{{contact.name}}</td>
        <td>{{contact.email}}</td>
        <td>{{contact.title}}</td>
        <td>{{contact.phone1}}</td>
        <td>{{contact.phone2}}</td>
        <td>{{contact.phone3}}</td>
      </tr>
      {{/each}}
    </tbody>
  </table>
</template>

我们现在要做的是创建一个contacts mongo集合,它将存储所有联系人数据。然后,我们在服务器上定义一个发布函数,将所有联系人数据发布到客户端。从客户端(例如,我们订阅出版物的模板)这是模板获取其数据的方式,并向返回mongo光标的模板提供帮助函数contactList。Blaze当然能够在光标上进行迭代,我们的所有联系人都将显示在屏幕上。

联系人列表帮助程序不向您提供预期联系人列表的直接原因是您调用了异步函数$.ajax,并且在调用之后不返回任何内容

Meteor不知道异步调用何时完成,也不知道其结果

如果您真的需要保留AJAX调用,可以将结果存储在中,并在助手中读取。每当该助手函数中的反应源更新时,Meteor。因此,模板到达时将自动接收结果

从“meteor/reactive var”导入{ReactiveVar} var触点=新的反应var; Template.templateName.onCreatedfunction{ $.ajax{ url:Meteor.absoluteUrl+'contacts/get\u by\u company/'+Session.get‌​'公司名称', 键入:“GET”, 错误:函数{callback;}, 成功:函数res{ console.logres; contacts.setres;//更新被动变量。 return res;//无用。 } }; }; Template.templateName.helpers{ 联系人列表:功能{ return contacts.get;//稍后将更新,Meteor将自动刷新帮助程序。 } };
也就是说,正如@jordanwillis所指出的,在Meteor中几乎不需要REST端点。如果你能重新考虑你检索联系人列表的方式,你可以得到一个更像流星的结构,它具有实时更新、客户端数据操作的灵活性等所有优点。

with也不起作用。盲目地尝试帮助是不可能的。您是否可以编辑您的问题并至少添加您的模板定义您的HTML文件和模板行为您的租户js。@jordanwillis这里控制台日志中的contactList显示带有以下键的数据{{each contactList}}{{name}}{email}{{title}{{phone1}}{{phone2}{{phone3}{{{/each}}萨加尔可能没有编辑其问题的特权。所以我继续向这个问题添加了他的评论。这是我试图在一个助手问题中运行异步函数的经典例子,这个问题已经被回答了很多次。在模板的onCreated回调中而不是在helper中执行ajax请求request@Sagar为什么?您必须使用ajax请求从自己的内部获取自己的数据
应用程序?这是我所拥有的项目结构to@Sagar流星可能不是你想用的。在Meteor的背景下,采用这种方法是没有意义的。
const Contacts = new Mongo.Collection('contacts');

if (Meteor.isServer) {
  Meteor.publish('contacts', function() {
    return Contacts.find();
  });
}

if (Meteor.isClient) {
  Template.manageContacts.onCreated(function() {
    Meteor.subscribe('contacts');
  });

  Template.manageContacts.helpers({
    contactList: function() {
      return Contacts.find({
        company_id: Session.get(‌​'company_id')
      });
    }  
  });
}