Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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,我有一个loginview及其loginmodel。loginmodel是从主路由器的初始化创建的。这样,根据loginmodel的loginp属性,mainrouter的渲染\ U home决定是渲染homeview还是导航到调用渲染\ U login的登录路径render\u login有一个方法来save()从loginview的输入字段填充的loginmodel。因此,如果数据正确save()。因此,现在应该渲染homeview。但我不能成功 我认为在这一点上,控制应该传递回主路由器的路

我有一个loginview及其loginmodel。loginmodel是从主路由器的初始化创建的。这样,根据loginmodel的loginp属性,mainrouter的
渲染\ 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)(如果您没有编辑权限)将新代码添加为注释,我很乐意使用它更新我的答案。