Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 在木偶网中,如何将消息从视图函数发送到路由器?_Backbone.js_Marionette - Fatal编程技术网

Backbone.js 在木偶网中,如何将消息从视图函数发送到路由器?

Backbone.js 在木偶网中,如何将消息从视图函数发送到路由器?,backbone.js,marionette,Backbone.js,Marionette,我正在使用Browserify(有点像AMD) 在查看事件处理程序时,在验证密码后,我想向路由器发送一条消息“login\u success”,以更改路由 在路由“login_success”处理程序中,我想调用route.navigate(“/newRoute”),它是从主干扩展的函数 但我还没有弄清楚如何将消息从视图发送到路由器。任何人都可以共享示例代码或链接吗 在主干网中是否有更改路由的最佳实践 谢谢 最直接的方法就是使用 如果你希望有一些地方导航机构,你可以 App.execute("n

我正在使用Browserify(有点像AMD)

在查看事件处理程序时,在验证密码后,我想向路由器发送一条消息“login\u success”,以更改路由

在路由“login_success”处理程序中,我想调用route.navigate(“/newRoute”),它是从主干扩展的函数

但我还没有弄清楚如何将消息从视图发送到路由器。任何人都可以共享示例代码或链接吗

在主干网中是否有更改路由的最佳实践


谢谢

最直接的方法就是使用

如果你希望有一些地方导航机构,你可以

App.execute("navigate:to", "/url")
并按照您认为合适的方式实施:

App.commands.setHandler("navigate:to", function(url){
    ...
    Backbone.history.navigate(url)
})

就我个人而言,我喜欢去触发一个事件,你的路由器正在听,然后行动的路线

所以说在你看来你可以说

onPasswordVerified: function() {
  this.trigger "password:verified"
}
然后,在控制器中,您可以侦听该事件(注意,有时,根据您是否正在侦听集合/复合视图,这会以childview开头,但我怀疑您是否正在侦听登录页面):

最后,在路由器中,您可以收听该事件(我通常在我的应用程序对象中构建一个
navigate
函数,它在后台执行
Backbone.history.navigate
):


最棒的是,如果你的应用程序中有其他部分应该听这个事件,那么他们可以相应地采取行动。同样,通过这种路由方式,您可以更新到页面的url/路由,就像您完成了
主干网.history.navigate({trigger:true})
一样,而无需相关的“刷新页面”服务器调用。

使用内置于木偶网中的主干网.wreqr来帮助我解决此问题。您提到的@listenTo在路由器或视图中?路由器是如何知道应用程序的?他们完全分开了。顺便说一句,我还不知道coffeescript,但当我将其转换为javascript时,“函数”触发了一个编译错误。哈哈,是的,我实际上是在将我的应用程序从coffeescript转换为javascript(我已经很久没有用它写过了)。@在coffeescript中就是这个意思,所以@listenTo就是这个。让我更新一下javascript。哦,@listenTo将在控制器中(假设您使用的是控制器)。若你们并没有使用控制器,你们可以在视图本身中执行App.vent.trigger,而不是this.trigger,首先触发事件谢谢你们的简短回答。我喜欢它,因为它很短。如果我没有设置处理程序,是否会出现错误(未定义)?同一事件是否可以存在多个处理程序?否。这是命令和事件之间的主要区别-命令是应用程序提供的单个服务。应用程序中只有一个实体可以实现它。
this.listenTo(loginView, "password:verified", function(args) {
  App.vent.trigger "password:verified"
});
App.vent.on "password:verified", function() {
    App.navigate("/users");
    API.userProfile();
}