Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.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
Javascript 当主干应用程序中触发输入字段事件时,第一视图不希望从第二视图渲染?_Javascript_Backbone.js - Fatal编程技术网

Javascript 当主干应用程序中触发输入字段事件时,第一视图不希望从第二视图渲染?

Javascript 当主干应用程序中触发输入字段事件时,第一视图不希望从第二视图渲染?,javascript,backbone.js,Javascript,Backbone.js,我的每个视图都有一个模型和一个模板,还有一个表单模型实例,用于从各自的模板渲染它们。可以从两个视图访问表单模型实例以呈现其模板。需要在键入的每个字符上更新此表单模型实例,并使用此表单模型实例设置两个视图的当前视图的模型。为此,我在两个视图中的input元素上都有一个keyup事件,该事件具有不同数量的输入视图。第二个视图具有与第一个视图相同的类型、命名、id、input字段和一些不同的字段 当我在具有更多输入字段的第二个视图上,单击并在两个视图的输入字段中键入一个字符时,第一个视图将渲染。在一个

我的每个视图都有一个模型和一个模板,还有一个表单模型实例,用于从各自的模板渲染它们。可以从两个视图访问表单模型实例以呈现其模板。需要在键入的每个字符上更新此表单模型实例,并使用此表单模型实例设置两个视图的当前视图的模型。为此,我在两个视图中的
input
元素上都有一个
keyup
事件,该事件具有不同数量的输入视图。第二个视图具有与第一个视图相同的类型、命名、id、
input
字段和一些不同的字段

当我在具有更多输入字段的第二个视图上,单击并在两个视图的输入字段中键入一个字符时,第一个视图将渲染。在一个视图路由到另一个视图之前,从其中一个视图调用
this.unbind()
,无法工作

这是什么原因?完成此操作后,我没有事件来渲染它。 主路由器:

    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;
});

当实例化
视图时
可以在该
视图的
el
上设置事件绑定。如果不同的
视图
也使用相同的
输入
,这并不重要;只要第一个
视图仍然存在,它的事件处理程序就会继续侦听和响应事件


尝试调用
this.unbind()
,您的想法是正确的。。。除了
View
s没有
unbind
方法之外。但是,它们确实有一个
取消legateevents
方法,我想这就是您要寻找的方法。

在主路由器中,侦听器:

this.listenTo( this.formsDataModelInst, 'change', this.render_home );
导致在键入
registerview
时出现不希望出现的渲染
loginview
问题。因为在
registerview
keyup
上绑定到
updateModels
,而这
更改
同时包含
registermodel
formsDataModelInst
。此
更改
触发上述写入事件,该事件将
路由
s到
登录视图
并呈现它

FormsDataModelist
change
s的
loginp
属性时,需要上述侦听器来决定在
mainRouter
render
中实现哪个视图,而不是在其他属性(如在
keyup
事件中更新的属性)中
change
s

将其更改为:

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

我在loginview和registerview中分别使用了
this.undelegateEvents()
方法,用于在一个视图中单击按钮时通过mainrouter路由到另一个视图
render_login:function(e){e.preventDefault();this.undelegateEvents();Backbone.history.navigate(“/login”,{trigger:true});},
。通过主路由器的路由,此呈现过程调用了一个方法:
render\u login:function(){this.loginView=new loginView;this.loginView.render();},
。但当我开始在任何输入字段中输入registerview时,loginview立即出现在屏幕上。基本上我说的是正确的:A)您有一个事件处理程序导致您看到的行为,B)该事件处理程序(可能)来自主干视图的实例,C)如果您断开该处理程序,也就是说,通过在相应的
视图上调用
undelegateEvents
,它将解决您的问题。除此之外,我建议您编辑您的问题,以包括
LoginView
RegisterView
类的代码,以及
路由器的代码。如果不是不可能的话,我将很难帮助你。谢谢,我有一个听众正在收听FormsDataModelist,了解mainRouter中的更改。在register视图上,我键入更新的东西,方法更新了FormsDataModelist和registerModel。因此触发formsDataModel上绑定到更改的方法,这是上面主路由器的.render_home方法。除非loginp为true,否则此方法将路由回登录路由,因此呈现loginview。我已经将FormsDataModelist上的更改侦听器缩小到change:loginp。所以它起作用了。即使这样也奇怪地起作用了。即使是经过用户验证并呈现homeview的用户,如果在某个时间之后刷新页面并再次登录查看。然后重新刷新homeview。后来我写了listenTo s只监听同步事件并触发导航,而不是创建和渲染。