Ререндеринг страницы Meteor с помощью маршрутизатора Backbone

Я пытаюсь создать приложение для блога с помощью Meteor. В этом блоге есть главная страница, где посетители будут просто читать сообщения, и еще один раздел, где будет панель «администратора», где я могу редактировать сообщения. Я пытаюсь использовать помощники по шаблонам handlebars, но я не уверен, где я ошибся. Я также являюсь разработчиком-любителем и пытаюсь лучше изучить структуру Meteor. Мой код такой:

блог.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», как закодировано, но страница/шаблон не перерисовывается, чтобы отображать «Администратор». ' текст.

Однако, если бы я установил var page = 'admin' и обновил приложение, страница отлично перерисовывала бы сообщение администратора. Я не уверен, правильно ли я использую помощники шаблона handlebars для такого рода «обновления одностраничного шаблона с маршрутизацией». Спасибо за любую помощь!


person Jeff Lam Tian Hung    schedule 19.10.2012    source источник


Ответы (1)


Ваша переменная «страница» не является реактивной, это просто переменная JavaScript. У него нет возможности уведомить Meteor об изменениях.

Когда я начал использовать Meteor, я поместил «код» страницы в переменную сеанса для аналогичных целей, и это вызовет обновления вашей страницы. Например:

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

и в вашем маршрутизаторе:

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

(Хотя вы, вероятно, захотите поместить бит Session.set в свою собственную функцию)

Поскольку переменные сеанса являются реактивными в среде Meteor и будут уведомлять об изменении.

person Joc    schedule 20.10.2012
comment
Спасибо! Однако есть одна небольшая ошибка: вместо return Session.get(page) следует вернуть Session.equals(page, type) для завершения функции. Но вы указали мне на правильный путь, так что большое вам спасибо! - person Jeff Lam Tian Hung; 20.10.2012
comment
Ха, да, извините, я думал о своем собственном коде для этого, но да, теория та же. Сказав, что сейчас я не так часто использую этот метод, поскольку он требует большого количества операторов «если», которые могут стать довольно загроможденными по мере роста вашего сайта и использовать более динамичный метод сейчас. - person Joc; 21.10.2012
comment
Спасибо за это. Может быть, я лучше пойму метеор через несколько дней и смогу создать для этого свой собственный реактивный контекст. кто-нибудь пробовал метеор-маршрутизатор? github.com/tmeasday/meteor-router к сожалению, у меня много ошибок, если я пытаюсь использовать Это :( - person dustin.b; 22.10.2012
comment
Привет, dustin.b, есть несколько маршрутизаторов для Meteor, включая пакет для блога Britto. Однако после столь долгих поисков я действительно хотел попробовать НЕ использовать внешние пакеты на данный момент... и этот метод лучше всего работает для многостраничной маршрутизации. - person Jeff Lam Tian Hung; 24.10.2012
comment
@Joc, не хочешь поделиться своим динамическим методом? Прямо сейчас я в основном использую шаблоны в шаблоне, поэтому по мере роста приложения оно по-прежнему очень управляемо, поскольку каждая «страница» находится в шаблоне с переменной сеанса, связанной с функцией магистрального маршрутизатора. - person Jeff Lam Tian Hung; 24.10.2012
comment
Джефф, на самом деле все просто, я использую backbone.js, но вы можете использовать любой маршрутизатор. И у меня в основном есть раздел URL-адреса с подстановочными знаками, чтобы указать имя шаблона для Meteor.render. Это может работать и для вложенного контента. Я ответил на вопрос об этом здесь: stackoverflow.com/questions/12968808/ - person Joc; 26.10.2012