我正在关注Discover Meteor本书
出于某种原因,edit_post.html
中的内容未显示{{#with post}}
:
<template name="postEdit">
{{#with post}}
<form class="main">
<div class="control-group">
<label class="control-label" for="url">URL</label>
<div class="controls">
<input name="url" type="text" value="{{url}}" placeholder="Your URL"/>
</div>
</div>
.
.
.
</form>
{{/with}}
</template>
post_edit.js的内容:
Template.postEdit.helpers({
post: function() {
return Posts.findOne(Session.get('currentPostId'));
}
});
Template.postEdit.events({
'submit form': function(e) {
e.preventDefault();
var currentPostId = Session.get('currentPostId');
var postProperties = {
url: $(e.target).find('[name=url]').val(),
title: $(e.target).find('[name=title]').val()
}
Posts.update(currentPostId, {$set: postProperties}, function(error) {
if (error) {
// display the error to the user
alert(error.reason);
} else {
Router.go('postPage', {_id: currentPostId});
}
});
},
'click .delete': function(e) {
e.preventDefault();
.
.
.
}
}
});
route.js:
this.route('postEdit', {
path: '/posts/:_id/edit',
data: function() { return Posts.findOne(this.params._id); }
});
如果我删除了{{#with post}}
。
我不确定这本书中的错误,或者我是否做错了。我是流星初学者,所以我不知道。
有任何解决此问题的建议吗?
答案 0 :(得分:3)
模板帮助器post
调用一个永远不会设置的Session变量,所以我认为findOne()返回一个假值。所以{{#with post}}正确地保持模板不显示。如果没有{{#with post}},您的模板就可以显示路由器中data
功能的帖子。您正在调用findOne()两次查找相同的数据,但这两种方法都可以获取模板所需的数据。
如果您想使用{{#with}},可以将route.js更改为:
this.route('postEdit', {
path: '/posts/:_id/edit',
before: function() { Session.set( "currentPostId", this.params._id ); }
});
答案 1 :(得分:1)
我正在查看本书中的代码,但我看不到您所指的带有块。
事实上,它不应该存在,因为模板的数据上下文已经由路由器设置。
你的模板助手(post)不应该在那里,因为它既不必要,实际上还没有设置会话变量,所以你的get按预期返回null。
只需删除你的助手和with块,让铁路由器提供已经存在的数据上下文。