3

Meteorでブログアプリケーションを作成しようとしています。このブログには、訪問者が投稿を読むだけのメインページと、投稿を編集できる「管理者」パネルとなる別のセクションがあります。ハンドルバーのテンプレートヘルパーを利用しようとしていますが、どこで間違っているのかわかりません。私はアマチュア開発者でもあり、Meteorフレームワークをよりよく学ぼうとしています。私のコードはそのようなものです:

blog.html

<head>
  <title>Jeff Lam Tian Hung</title>
</head>

<body>
  <h1>Jeff Lam Tian Hung</h1>
  <a href="/" class="main">Main Page</a>
  <a href="/admin" class="admin">Admin</a>
  {{> content}}
</body>

<template name="content">
  {{#if currentPage "blog"}}
    {{#each posts}}
      <h2>{{Title}}</h2>
      <p>{{Body}}</p>
    {{/each}}
  {{/if}}

  {{#if currentPage "admin"}}
    <h2>{{admin}}</h2>
  {{/if}}
</template>

blog.js

// Declaration of Collections
Posts = new Meteor.Collection("Posts");

// Helper variable is for pages
// TODO: changing this var will change the
// page but now how to rerender the page?
var page = "blog";

// Declaration of Template Reactivity Variables
Template.content.currentPage = function (type) {
  return page === type;
};
Template.content.posts = function () {
  return Posts.find({}, {sort: {Date: 1}});
};
Template.content.admin = function () {
  return "This will render admin section";
};

// Router for Pages
var Router = Backbone.Router.extend({
  routes: {
    "":      "main",
    "admin": "admin"
  },
  main: function () {
    page = "blog";
  },
  admin: function () {
    page = "admin";
  }
});

var BlogRouter = new Router;

Meteor.startup(function () {
  Backbone.history.start({pushState: true});
});

publish.js(サーバー側のコードのみ)

Posts = new Meteor.Collection("Posts");

ページは上記のコードでブログ投稿をレンダリングしますが、localhost:3000 / adminにアクセスすると、ページ変数はコード化されたように「admin」に設定されますが、ページ/テンプレートはそれ自体を再レンダリングして「Admin」を表示しません' 文章。

ただし、var page ='admin'を設定してアプリを更新すると、ページはadminメッセージを正常に再レンダリングします。ハンドルバーテンプレートヘルパーを正しく使用して、この種の「ルーティングを使用した1ページのテンプレートの更新」を行っているかどうかはわかりません。助けてくれてありがとう!

4

1 に答える 1

6

変数「ページ」はリアクティブではなく、単なるJavaScript変数です。Meteorに変更を通知する方法はありません。

Meteorを使い始めたとき、同様の目的でページの「コード」をSession変数に入れました。これにより、ページの更新がトリガーされます。例えば:

// Declaration of Template Reactivity Variables
Template.content.currentPage = function (type) {
    return Session.equals("page", type);
};

ルーター内:

...
Session.set("page", "admin");
…

(おそらく、Session.setビットを独自の関数に入れたいと思うでしょうが)

セッション変数はMeteorフレームワークでリアクティブであり、変更されると通知するためです。

于 2012-10-20T07:15:57.807 に答える