我有一个Meteor应用程序,它根据样本Todos app使用路由器,例如:
var TodosRouter = Backbone.Router.extend({
routes: {
":list_id": "main"
},
main: function (list_id) {
...
},
...
});
Router = new TodosRouter;
我有一个外部服务,通过对我指定的URL的POST请求完成后通知我。收到POST请求后,需要执行一些功能。我可以将此设置与上述框架一致吗?如果没有,我最好编写一个单独的非Meteor(例如nodejs)应用程序来处理POST,还是有办法让它在Meteor中工作?
我知道this,this和this StackOverflow问题类似,但没有一个答案解释了如何使用Backbone.Router
。
谢谢!
答案 0 :(得分:0)
以下是我从Backbone.Router
迁移到Iron-Router
的方式。我看不到同时使用它们的方法。
首先,我将@Christian Fritz的answer中的代码放在server
文件夹中:
Router.map(function () {
this.route('foo', {
path: '/foo',
where: 'server',
action: function() {
if (this.request.method == 'POST') {
console.log('post request received');
} else {
this.response.writeHead(404);
}
}
})
});
处理POST
请求,通过在console.log
中包含action
进行测试(将写入运行meteor
的终端窗口),然后输入:
curl --data "p=bar" localhost:3000/foo
然后我将Backbone.Router
调用替换为client
文件夹中的代码,如Iron-Router docs中所述,例如
Router.configure({
layoutTemplate: 'layout'
});
Router.map(function () {
this.route('home', {
path: '/',
template: 'homepage',
});
});
然后我不得不重写我的模板,以便从不同的模板生成页面,而不是从不同的Session
变量设置生成。这实际上简化了我的代码,例如。而不是:
<body>
{{#if onPage 'home'}}
{{> homepage }}
{{/if}}
{{#if onPage 'help'}}
{{> helppage }}
{{/if}}
...
</body>
和
UI.registerHelper("onPage", function(name) {
return Session.equals('page', name);
});
只是:
<template name="layout">
{{>yield}}
</template>
任何需要将用户定向到特定页面的JavaScript都使用Router.go()
和路径名称:
Router.go('home');
除此之外,我找到了一些地方,我以前可以假设我的馆藏.findOne()
找到了一个,但似乎已经破坏了Iron-Router。在if
中修改这些内容会修复它们。
在Meteor 0.8中,要检查您所在的页面,您可以使用(see here):
Router.current().lookupProperty('template')