Javascript 将控制权从视图传递回主干路由器?
我有一个loginview及其loginmodel。loginmodel是从主路由器的初始化创建的。这样,根据loginmodel的loginp属性,mainrouter的Javascript 将控制权从视图传递回主干路由器?,javascript,backbone.js,Javascript,Backbone.js,我有一个loginview及其loginmodel。loginmodel是从主路由器的初始化创建的。这样,根据loginmodel的loginp属性,mainrouter的渲染\ U home决定是渲染homeview还是导航到调用渲染\ U login的登录路径render\u login有一个方法来save()从loginview的输入字段填充的loginmodel。因此,如果数据正确save()。因此,现在应该渲染homeview。但我不能成功 我认为在这一点上,控制应该传递回主路由器的路
渲染\ U home
决定是渲染homeview还是导航到调用渲染\ U login
的登录路径render\u login
有一个方法来save()
从loginview的输入字段填充的loginmodel。因此,如果数据正确save()。因此,现在应该渲染homeview。但我不能成功
我认为在这一点上,控制应该传递回主路由器的路由,该路由再次调用上面的render_home
。因此,它测试loginView.model.get('loginp')==true
,结果为true,因此这次创建homeview并通过homeview中已定义的homeview.render()
渲染它
我在loginview中放置了一个listenTo,用于在其模型更改或同步到mainrouter中的call route时调用render_home。但这将在这两个视图之间无止境地结束,没有任何渲染<代码>this.listenTo(this.loginView.model'sync',Backbone.history.navigate(“,{trigger:true}”)代码>
顺便说一下,路线“
已分配给渲染回家
我错过了什么。不可能将控制权传递回路由器吗?
主路由器:
define([
'jquery',
'ratchet',
'underscore',
'backbone',
'login/loginmodel',
'login/loginview',
'register/registerview',
'home/homeview',
],
function($, Ratchet, _, Backbone, LoginModel, LoginView, RegisterView, HomeView){
var MainRouter = Backbone.Router.extend({
routes: {
"": "render_home",
"login": "render_login",
"register": "render_register"
},
initialize: function(){
this.loginView = new LoginView;
},
render_home: function(){
this.loginView.model.fetch({
success: function(model){
if( model.get('loginp') == true ){ //show you app view for logged in users!
this.homeView = new HomeView();
this.homeView.render();
}
else { //not logged in!
Backbone.history.navigate("/login", {trigger:true})
}
},
});
},
render_login: function(){ //display your login view
this.loginView.render();
},
render_register: function(){ //display your register view
this.registerView = new RegisterView;
this.registerView.render();
},
});
return MainRouter;
});
loginview:
define([
'jquery',
'ratchet',
'underscore',
'backbone',
'login/loginmodel',
'text!login/logintemplate.html',
],
function($, Ratchet, _, Backbone, LoginModel, LoginTemplate){
var LoginView = Backbone.View.extend({
el: $('body'),
initialize: function(){
this.model = new LoginModel;
},
template: _.template( LoginTemplate ),
render: function(){ //display your login view
this.$el.html( this.template( this.model.attributes ) );
},
events: {
'keyup input' : 'updateform',
'click #loginbutton' : 'login',
'click #renderregisterbutton' : 'render_register',
},
updateform: function(e){
var el = e.target;
var formData = {};
formData[ el.id ] = $(el).val();
this.model.set( formData );
},
login: function(e){
e.preventDefault();
this.model.save();
console.log( JSON.stringify( this.model ) );
},
render_register: function(){
Backbone.history.navigate("/register", {trigger:true});
},
});
return LoginView;
});
登录模型:
define([
'underscore',
'backbone',
],
function(_, Backbone) {
var LoginModel = Backbone.Model.extend({
urlRoot: '/log_in',
defaults: {
username: null,
},
});
return LoginModel;
});
您完全可以将控制权从路线
传递到视图
并返回;您的render\u login
函数正好执行以下操作:
render_login: function(){ //display your login view
// 1) router has control
this.loginView.render(); // 2) control passes to loginView
// 3) control passes back to the router
},
但这只适用于同步逻辑。我认为您遇到的问题是因为您在render\u home
方法中使用了异步逻辑(this.loginView.model.fetch()
)。异步逻辑从主执行路径分离,因此render\u home
的路径更像:
// 0) Router has control, and calls render_home
render_home: function(){
// 1) LoginView has control
this.loginView.model.fetch({
success: function(model){
// 4) LoginView has control once again, but now routing is done
if( model.get('loginp') == true ){ //show you app view for logged in users!
this.homeView = new HomeView();
this.homeView.render();
}
else { //not logged in!
Backbone.history.navigate("/login", {trigger:true})
}
},
});
// 2) LoginView still has control
},
// 3) Control passes back to the Router, which finishes routing
因此,当fetch
返回时,没有返回的路由逻辑
但是,这很容易解决:只需从获取成功处理程序调用主干.history.navigate
(使用触发器:true
)即可。这将启动一个新的路由过程,到那时(由于获取
已完成),将填充登录模型
,您的路由逻辑将正常工作。感谢您的回复。它给了我关于控制通行证的见解。当我添加了你建议的导航时,它导致了两个视图之间无休止的来回。现在我已经解决了。我写完后再写。它在路由器中包含一个this.listenTo(this.loginView.model,'change',this.render_home)//这解决了render_home问题。
Ah,很抱歉,我的解决方案“开箱即用”不起作用(如果没有IDE/测试环境,有时很难为StackOverflow编写代码)。当您有最终的解决方案时,您可以:A)将其作为单独的答案发布,B)编辑我的答案并添加新代码,或者C)(如果您没有编辑权限)将新代码添加为注释,我很乐意使用它更新我的答案。