0

在我的应用程序中,我有这些布局的布局和视图。布局仅在登录/注销时更改,但另一种特殊情况是在页面加载时我需要加载正确的布局。但是,在我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
    };
});

我怎样才能让我的布局在我的视图之前完全呈现?

4

2 回答 2

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);
于 2012-06-07T02:31:38.477 回答
0

问题是因为我的布局在我的视图初始化之前没有渲染,所以el是空的。我所做的是将所有对象转换为返回object而不是instancerender ,并在初始化后让它们返回。这样,当我声明 anew MyLayout然后 anew MyView时,我可以保证MyView'sel是有效的。

于 2012-06-07T03:16:51.890 回答