モデルとテンプレートを備えたビューと、それぞれのテンプレートからレンダリングするための1つのフォームモデルインスタンスがあります。フォームモデルインスタンスには、両方のビューからアクセスして、テンプレートをレンダリングできます。入力したすべての文字でこのフォームモデルインスタンスを更新し、このフォームモデルインスタンスを使用して2つのビューの現在のビューのモデルを設定する必要があります。このために、入力ビューの数が異なる両方のビューの要素keyup
に関するイベントがありinput
ます。2番目のビューにはinput
、最初のビューといくつかの異なるタイプ、名前付き、ID、フィールドがすべて同じです。
より多くの入力フィールドがある2番目のビューにいて、両方のビューにある入力フィールドをクリックして文字を入力すると、最初のビューがレンダリングされます。this.unbind()
他のビューにルーティングする前に、一方のビューからの呼び出しは機能しませんでした。
これの理由は何ですか?これが行われたときにそれをレンダリングするイベントがありません。mainrouter:
define([
'jquery',
'ratchet',
'underscore',
'backbone',
'forms/formsdatamodel',
'login/loginview',
'register/registerview',
'home/homeview',
],
function($, Ratchet, _, Backbone, FormsDataModelInst, LoginView, RegisterView, HomeView){
var MainRouter = Backbone.Router.extend({
routes: {
"": "render_home",
"login": "render_login",
"register": "render_register"
},
initialize: function(){
this.model = FormsDataModelInst;
this.listenTo( this.model, 'change', this.render_home );//this solved render_home problem.
},
render_home: function(){
if( this.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 = new LoginView;
//this.loginView.delegateEvents();
this.loginView.render();
},
render_register: function(){ //display your register view
this.registerView = new RegisterView;
//this.registerView.delegateEvents();
this.registerView.render();
},
});
return MainRouter;
});
loginview:
define([
'jquery',
'ratchet',
'underscore',
'backbone',
'login/loginmodel',
'text!login/logintemplate.html',
'forms/formsdatamodel',
],
function($, Ratchet, _, Backbone, LoginModel, LoginTemplate, FormsDataModelInst){
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( FormsDataModelInst.attributes ) );
},
events: {
'keyup input#username' : 'updateModel',
'click #loginbutton' : 'login',
'click #renderregisterbutton' : 'render_register',
},
updateModel: function(e){
e.preventDefault();
var elm = e.target;
FormsDataModelInst.set( elm.id, $( elm ).val() );
this.model.set( FormsDataModelInst );
console.log( "1-FormsDataModelInst:" + JSON.stringify( FormsDataModelInst.attributes ) );
console.log( "2-this.model.set(...):" + JSON.stringify(this.model.attributes) );
},
login: function(e){
e.preventDefault();
this.model.save();
console.log( "3-this.model.save():" + JSON.stringify(this.model.attributes) );
},
render_register: function(e){
e.preventDefault();
this.undelegateEvents();
Backbone.history.navigate("/register", {trigger:true});
},
});
return LoginView;
});
レジスタービュー:
define([
'jquery',
'ratchet',
'underscore',
'backbone',
'register/registermodel',
'text!register/registertemplate.html',
'forms/formsdatamodel',
],
function($, Ratchet, _, Backbone, RegisterModel, RegisterTemplate, FormsDataModelInst){
var RegisterView = Backbone.View.extend({
el: $('body'),
initialize: function(){
this.model = new RegisterModel();
},
template: _.template( RegisterTemplate ),
render: function(){ //display your login view
this.$el.html( this.template( FormsDataModelInst.attributes ) );
},
events: {
'keyup input#username' : 'updateModel',
'keyup input#phone' : 'updateModel',
'keyup input#email' : 'updateModel',
'click #registerbutton' : 'register',
'click #renderloginbutton' : 'render_login',
},
updateModel: function(e){
e.preventDefault();
var elm = e.target;
FormsDataModelInst.set( elm.id, $( elm ).val() );
this.model.set( FormsDataModelInst );
console.log( "FormsDataModel:" + JSON.stringify( FormsDataModelInst ) );
console.log( "this.model.set(...):" + JSON.stringify(this.model.attributes) );
},
login: function(e){
e.preventDefault();
this.model.save();
console.log( "this.model.save():" + JSON.stringify(this.model) );
},
render_login: function(e){
e.preventDefault();
this.undelegateEvents();
Backbone.history.navigate("/login", {trigger:true});
},
});
return RegisterView;
});
mainRouterでは、リスナーは次のようになります。
this.listenTo( this.formsDataModelInst, 'change', this.render_home );
をloginview
入力すると、望ましくないレンダリングの問題が発生しますregisterview
。onregisterview
keyup
はにバインドされてupdateModels
おり、これはとchange
の両方registermodel
であるためformsDataModelInst
です。これは、change
上に書かれたイベントをトリガーroute
し、loginview
それをレンダリングします。
上記のリスナーは、のloginp
プロパティがでformsDataModelInst
change
実装されているようにレンダリングするビューを決定するときに必要ですmainRouter
render
が、フォームchange
上のkeyup
イベントで更新されるような他のプロパティでは必要ありません。
次のように変更します。
this.listenTo( this.formsDataModelInst, 'change:loginp', this.render_home );
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加