MeteorJS:使用Backbone.js进行路由

时间:2012-07-12 21:39:02

标签: javascript node.js meteor backbone.js url-routing

我正在尝试在我的MeteorJS应用程序中使用BackboneJS实现路由器。 当您调用网址“localhost:3000/1”时,我的路由器会在会话中存储ID“1”。之后我想从会话中获取id并在我的查询中使用它来从我的集合中选择一个对象。但每当我尝试在查询中使用会话属性时,它都会失败。所以我想知道是否有更好的方法可以使用MeteorJS进行路由以及我的查询失败的原因。

test.js

Meteor.subscribe("test");

Test = new Meteor.Collection("test");

Session.set("id", null);

Template.hello.test = function () {
  var avg = 0, total = 0, cursor = Test.find(), count = cursor.count();
  cursor.forEach(function(e)
  {
    total += e.number;
  });
  avg = total / count;

  var session_id = Session.get("id");

  var test = Test.findOne({id: session_id}); //doesn't work
  if (test) {
    test.avg = avg;
  }

  return test;
}

//ROUTER
var TestRouter = Backbone.Router.extend({
  routes: {
    ":get_id":    "get_id" 
  },
  get_id: function (get_id) {
    Session.set("id", get_id);
    console.log(get_id);
  }
});

Router = new TestRouter;

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

的test.html

<head>
  <title>test</title>
</head>

<body>
  {{> hello}}
</body>

<template name="hello">
  <h1>Hello World!</h1>
  {{#if test}}
    {{#with test}}
      ID: {{id}}  Name: {{name}}  AVG: {{avg}}
    {{/with}}
  {{/if}}
</template>

model.js

Test = new Meteor.Collection("test");

Test.remove({});

if (Test.find().count() < 1) 
{
    Test.insert({id: 1,
                 name: "test1",
                 number: 13});

    Test.insert({id: 2,
                 name: "test2",
                 number: 75});
}

Meteor.publish('test', function () {
  return Test.find();
});

3 个答案:

答案 0 :(得分:3)

我调试代码并发现集合中的'id'是一个整数,而session_id是一个字符串。你需要parseInt来转换session_id。

我使用page.js进行路由,这是“受Express路由器启发的微客户端路由器”,这是“TJ Holowaychuk”的出色作品。

我强烈建议,因为Meteor和骨干在Model / Collection&amp; amp;视图/模板。

答案 1 :(得分:0)

吉峰是正确的,如果你只需要路由功能,那么page.js就足够了。

吉峰和我在一个团队中。直到最近,我们还得出“Meteor和Backbone在Model / Collection&amp; View / Template中有一些功能碰撞”的结论。随着我们对Meteor和Backbone的理解越来越深入,这个结论需要重新评估。请将我的上一个实验代码称为BBCloneMail-on-Meteor:Derick Bailey修改为在Meteor上运行的BBCloneMail。关键是要在Meteor的集合中实现Backbone存储插件。一旦插件接线生效,只需要进行一些修改。

答案 2 :(得分:0)

您可能会发现感兴趣的铁路由器 - 它是特定于流星的,并且“了解您的订阅,数据来源并帮助您处理常见问题”:https://github.com/EventedMind/iron-router