【发布时间】:2014-10-16 22:13:49
【问题描述】:
我有一个登录视图和它的登录模型。 loginmodel 是从主路由器的初始化创建的。这种方式根据loginmodel的loginp属性mainrouter的render_home决定是渲染homeview还是导航到调用render_login的登录路由。 render_login 有一个方法来save() 从登录视图的输入字段填充的登录模型。所以如果save()响应的数据是正确的并且loginmodel改变了,它的loginp属性就变为true。所以现在应该渲染主视图。但我无法成功。
我认为此时应该将控制权传递回主路由器的路由,该路由再次调用上面的render_home。所以它测试loginView.model.get('loginp') == true 并结果为true,所以这次创建homeview 并通过已经在homeview 中定义的homeView.render() 呈现它。
我在登录视图中放置了一个listenTo,用于当它的模型更改或同步时调用mainrouter中的路由来调用render_home。但这以这两个视图之间无休止的来回结束而没有任何渲染。 this.listenTo( this.loginView.model, 'sync', Backbone.history.navigate("",{trigger:true}));
路由""顺便分配给render_home。
我错过了什么。不能将控制权交还给路由器吗? 主路由器:
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;
});
登录查看:
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;
});
【问题讨论】: