骨干视图无法按顺序呈现

时间:2012-06-07 00:12:01

标签: layout backbone.js underscore.js requirejs router

在我的应用中,我有这些布局的布局和视图。布局仅在登录/注销时更改,但另一个特殊情况是在页面加载上我需要加载正确的布局。但是,在我的defaultAction中,我的布局在返回之后实际上没有渲染,所以当视图尝试渲染时,它应该包含的el不存在。

// Filename: router.js
var app_router;
define( [ 'views/layouts/beta', 'views/beta/requestInvite', 'views/beta/login', 'views/app/dashboard' ],
function(betaLayout, requestInviteView, loginView, dashboardView) {
    var AppRouter = Backbone.Router.extend( {
        routes : {
            // Pages
            'login' : 'login',
            'dashboard' : 'dashboard',

            // Default
            '*actions' : 'defaultAction'
        },

        // Pages
        login : function() {
            loginView.render();
        },

        dashboard : function() {
            dashboardView.render();
        },

        // Default
        defaultAction : function(actions) {
            betaLayout.render();
            requestInviteView.render();
        }
    });

    var initialize = function() {
        app_router = new AppRouter;

        $('a').live('click', function() {
            var href = $(this).attr('href');

            // only navigate to real links
            if(href == undefined)
                return;

            app_router.navigate(href, {trigger: true});

            return false;
        });

        Backbone.history.start({pushState: true});
    };
    return {
        initialize : initialize
    };
});

如何在观看前完全渲染我的布局?

2 个答案:

答案 0 :(得分:1)

定义betaLayout.render()的回调作为参数,在渲染实际完成时执行。

例如,betaLayout.render()看起来像:

render: function(callback) {
    /* code to render your element,
       using the following line when all
       asynchronous calls are complete */
    if (callback) callback();
}

并且您的defaultAction会像这样使用它,并将第二个render()作为其回调传递。

betaLayout.render(requestInviteView.render);

答案 1 :(得分:0)

问题是因为我的布局在我的视图初始化之前没有渲染,所以el为空。我所做的是转换所有对象以返回对象而不是实例,并在初始化后让它们render。这样,当我声明new MyLayout然后new MyView时,我可以保证MyView的{​​{1}}有效。