2015-02-11 37 views
7

Tôi đã làm theo hướng dẫn để tạo ra một diễn đàn đơn giản, sau khi cuối cùng nhận được tất cả các mã có được với nhau, nó nói với tôi 'mẫu không được định nghĩa'Tại sao đối tượng mẫu Meteor không được xác định?

Mã của 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> 

Mã của 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(''); 
    } 
}; 

Dưới đây là một số kết quả tôi nhận được từ thiên thạch

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 - tôi có cùng lỗi này vì tôi vô tình di chuyển một trong các thư mục mẫu của tôi bên ngoài thư mục máy khách vào thư mục gốc. do đó, việc tôi chuyển từ /partners/partner.html trở lại /client/partners/partner.html tất cả đều tốt hơn. – xeo

Trả lời

7

Có 2 vấn đề với mã của bạn:

  • Định nghĩa mẫu không có sẵn trên máy chủ, do đó bạn cần phải quấn nét Template.form trong tình trạng Meteor.isClient, hoặc tốt hơn là tách mã của bạn sử dụng clientserver thư mục.

  • đúng định nghĩa bản đồ sự kiện cần phải sử dụng cú pháp sau: Template.form.events({...}); không Template.form.events={...};

1

Lý do tại sao bạn đang nhìn thấy những lỗi mà bạn đang là bởi vì tài liệu tham khảo thứ hai của mình vào đối tượng Template không được xác định là chạy một cách rõ ràng trên máy khách, như tham chiếu đầu tiên của bạn là Template. Đối tượng Template chỉ khả dụng trên máy khách, như được mô tả chi tiết trong tài liệu của 01 Meteorite. Bạn chỉ cần đưa khung đóng của khối mã if(Meteor.isClient){} xuống dưới định nghĩa Template.form.events của mình.

Điều này, tuy nhiên, sẽ trả về chủ đề của cấu trúc ứng dụng và cách tránh các vấn đề như thế này trong tương lai trong khi phát triển thêm ứng dụng của bạn. Nếu bạn xem xét this documentation, bạn nên chia mã JS của mình thành ít nhất hai vị trí khác nhau để tránh gặp phải các vấn đề như thế này trong tương lai. Tôi sẽ đề nghị di chuyển đường var Posts = new Meteor.Collection('posts'); của bạn vào tệp JS trong thư mục server cấp cao nhất (name_of_app_directory/server) và di chuyển tất cả mã JS khác vào tệp JS trong thư mục client cấp cao nhất (name_of_app_directory/client). Bằng cách này, bạn có thể loại bỏ nhu cầu cũng bao gồm khối if(Meteor.isClient){} trong mã của bạn và không còn cơ hội để thấy lỗi mà bạn có.

Ngoài ra, điều cuối cùng cần cân nhắc. Khi xác định mẫu của bạn events đối tượng, hãy xác định đối tượng tương tự như cách bạn đã xác định mẫu của mình đối tượng helpers (Template.form.events({...})). Để biết thêm thông tin về điều này, hãy xem this documentation.

Các vấn đề liên quan