2015-02-11 2 views
7

Я следовал учебник, чтобы сделать простой форум, после того, как наконец-то весь код, собираются вместе, он говорит мне «Шаблон не определен»Почему объект шаблона Meteor не определен?

Кодекс 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. 
+0

fyi - у меня была такая же ошибка, потому что я случайно переместил одну из моих папок шаблонов clent за пределы папки клиента в корневой каталог. поэтому мое перемещение из /partners/partner.html обратно в /client/partners/partner.html все лучше. – xeo

ответ

7

Там в 2 проблемы с кодом:

  • определение шаблона не доступен на сервере, так что вам нужно обернуть Template.form определение в Meteor.isClient состоянии, или еще лучше, отделить код, используя client и server каталогов.

  • Правильное определение карты событий необходимо использовать следующий синтаксис: Template.form.events({...}); не Template.form.events={...};

1

Причина, почему вы видите ошибку, что вы потому, что ваша вторая ссылка на Template объект не определен, чтобы быть выполняется явно на клиенте, например, ваша первая ссылка на Template есть. Объект Template доступен только на клиенте, как указано в документе this section документации Meteor. Вам просто нужно будет довести закрывающую скобку вашего кодового блока if(Meteor.isClient){} до уровня ниже вашего определения Template.form.events.

Это, однако, поднимает тему структуры приложения и как избежать таких проблем в будущем в ходе дальнейшей разработки вашего приложения. Если вы посмотрите на this documentation, настоятельно рекомендуется разделить ваш JS-код на по крайней мере два разных местоположения, чтобы избежать столкновения с такими проблемами в будущем. Я бы предложил переместить вашу строку var Posts = new Meteor.Collection('posts'); в файл JS в папке верхнего уровня server (name_of_app_directory/server) и переместить весь другой JS-код в файл JS в папке верхнего уровня client (name_of_app_directory/client). Таким образом, вы можете исключить необходимость включения блока if(Meteor.isClient){} в свой код и больше шансов увидеть имеющуюся у вас ошибку.

Также, окончательная вещь, котор нужно рассмотреть. При определении объекта шаблона events определите его так же, как вы уже определили свой шаблон helpers объект (Template.form.events({...})). Для получения дополнительной информации об этом см. this documentation.

Смежные вопросы