2012-06-07 72 views
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 
    }; 
}); 

我怎么能有我的布局,我的观点之前完全呈现?

回答

0

的问题是,因为我的看法是初始化之前我的布局并没有渲染的el是空的。我所做的就是将所有我的对象返回对象而不是实例,让他们render一旦他们被初始化。这样,当我宣布一个new MyLayout然后new MyView,我可以保证MyViewel是有效的。

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); 
+0

我想,在第一,但事实证明,布局已经呈现,但认为已经初始化之前** **,所以'el'是空的。 – Garrett

+0

啊,所以你在'requestInviteView'的'initialize'期间操作'betaLayout'的'el'?由于它看起来像是从所需文件中返回一个实例,请尝试[order!插件](http://requirejs.org/docs/1.0/docs/download.html#order)(如果您使用的是RequireJS 1.0)来强制文件执行并按照正确的顺序进行初始化。 否则,如果可能,操作代码转移到'requestInviteView'的'render',这样,当它的执行,你可以明确控制。 – freejosh