为什么没有定义流星模板对象?

时间:2015-02-11 02:06:50

标签: javascript meteor spacebars

我已经按照教程制作了一个简单的论坛,在最终将所有代码放在一起后,它告诉我'模板未定义'

forum.html代码

<head>
  <title>Forum</title>
</head>
<body>
  {{> form}}
  {{> posts}}
</body>

<template name="posts">
  <h1>Posts</h1>
  <ul>
    {{#each posts}}
      <li>
        <h3>{{title}}</h3>
        <p>{{body}}</p>
      </li>
    {{/each}}
  </ul>
</template>


<template name="form">
  <form>
    <label>Post Title:
      <input type="text" id="title" />
    </label>
    <label>Post Body:
      <textarea id="body"></textarea>
    </label>
    <input type="submit" value="Submit" id="submit"/>
  </form>
</template>

forum.js代码:

var Posts = new Meteor.Collection('posts');
  if (Meteor.isClient) {
    Template.posts.helpers({
      Posts: function() {
        return Posts.find();
      }
    });
  }

Template.form.events = {
  'click #submit': function(event){
    event.preventDefault();
    var title = $('#title').val();
    var body = $('#body').val();
    Posts.insert({
      title: title,
      body: body
    });
    $('#title, #body').val('');
  }
};

这是我从流星得到的一些输出

W20150211-02:01:42.086(0)? (STDERR)           
W20150211-02:01:42.088(0)? (STDERR) /home/ubuntu/.meteor/packages/meteor-tool/.1.0.40.1ef5dzv++os.linux.x86_64+web.browser+web.cordova/meteor-tool-os.linux.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:173
W20150211-02:01:42.088(0)? (STDERR)                                             throw(ex);
W20150211-02:01:42.088(0)? (STDERR)                                                   ^
W20150211-02:01:42.091(0)? (STDERR) ReferenceError: Template is not defined
W20150211-02:01:42.091(0)? (STDERR)     at app/forum.js:10:1
W20150211-02:01:42.091(0)? (STDERR)     at app/forum.js:23:3
W20150211-02:01:42.091(0)? (STDERR)     at /home/ubuntu/workspace/forum/.meteor/local/build/programs/server/boot.js:205:10
W20150211-02:01:42.092(0)? (STDERR)     at Array.forEach (native)
W20150211-02:01:42.092(0)? (STDERR)     at Function._.each._.forEach (/home/ubuntu/.meteor/packages/meteor-tool/.1.0.40.1ef5dzv++os.linux.x86_64+web.browser+web.cordova/meteor-tool-os.linux.x86_64/dev_bundle/server-lib/node_modules/underscore/underscore.js:79:11)
W20150211-02:01:42.092(0)? (STDERR)     at /home/ubuntu/workspace/forum/.meteor/local/build/programs/server/boot.js:116:5
=> Exited with code: 8
=> Your application is crashing. Waiting for file change.

2 个答案:

答案 0 :(得分:7)

您的代码有两个问题:

  • 模板定义在服务器上不可用,因此您需要将Template.form定义包含在Meteor.isClient条件中,或者更好的是,使用client和{{分隔您的代码1}}目录。

  • 正确的事件地图定义需要使用以下语法:server而非Template.form.events({...});

答案 1 :(得分:1)

您看到错误的原因是因为您对Template对象的第二次引用未指定在客户端上显式运行,就像您对Template的第一次引用一样。 Template对象仅在客户端上可用,详见Meteor文档的this section。您只需将if(Meteor.isClient){}代码块的右括号缩小到低于Template.form.events定义。

然而,这提出了应用程序结构的主题以及如何在应用程序的进一步开发过程中避免将来出现类似问题。如果你看一下this documentation,强烈建议你将你的JS代码分成至少两个不同的位置,以避免将来遇到这样的问题。我建议将您的var Posts = new Meteor.Collection('posts');行移动到顶级server文件夹(name_of_app_directory/server)中的JS文件中,并将所有其他JS代码移动到顶层的JS文件中级别client文件夹(name_of_app_directory/client)。这样,您就无需在代码中包含if(Meteor.isClient){}块,也无需再查看错误。

另外,最后要考虑的事情。定义模板events对象时,请按照您已定义模板helpers对象(Template.form.events({...}))的方式进行定义。有关详细信息,请参阅this documentation