使用{{#with}}包装模板时,模板不显示?

时间:2014-02-09 03:51:30

标签: javascript meteor

我正在关注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}}

,则会显示模板

我不确定这本书中的错误,或者我是否做错了。我是流星初学者,所以我不知道。

有任何解决此问题的建议吗?

2 个答案:

答案 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块,让铁路由器提供已经存在的数据上下文。