バックボーンアプリで入力フィールドイベントがトリガーされたときに、最初のビューが2番目のビューから望ましくない形でレンダリングされますか?

sçuçu

モデルとテンプレートを備えたビューと、それぞれのテンプレートからレンダリングするための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;
});
sçuçu

mainRouterでは、リスナーは次のようになります。

this.listenTo( this.formsDataModelInst, 'change', this.render_home );

loginview入力すると、望ましくないレンダリングの問題が発生しますregisterviewonregisterview 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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ