我正在尝试在我的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();
});
答案 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