2013-07-24 43 views
0

初始化的Backbone.js的模型,我有以下Backbone.js的應用程序的初始化過程:

var app = { 
    init: function(arg) { 
    $.when(app.loadStaticFiles('any_file_to_load_before')) 
    .done(function(args) { 
     app.models.current_user = app.Models.User(); 
    }); 
    // ... 
    // initializing the backbone app and models 
    // ... 
    $.ajaxSetup({ 
     headers: {Authorization: 'Token token=' + app.models.current_user.get('token')} 
    }) 
    }  
} 
$(document).ready(
    function(){ 
    app.init(args); 
    }; 
); 

然後,當應用程序初始化$ .ajaxSetup評估app.models.current_user.get('token')這可悲的就是沒有定義的。

我想我的設計中有一些錯覺,我應該如何重寫我的代碼才能使其工作?

我覺得主要的問題是$.ajaxSetup()$.deferred分辨率之前的評估。

回答

0

延期是爲了控制您的應用程序的進程順序。從閱讀你的問題,看來你的應用程序的訂單必須是:

  1. app.loadStaticFiles('any_file_to_load_before')
  2. app.models.current_user = app.Models.User();
  3. $.ajaxSetup(...)
  4. 初始化骨幹應用和模式?

你可以寫成這樣使用deferreds爲:

var app = { 
    init: function(arg) { 
    $.when(app.loadStaticFiles('any_file_to_load_before')) 
     .done(function(args) { 
     app.models.current_user = app.Models.User(); 
     }) 
     .done(function() { 
     $.ajaxSetup({ 
      headers: {Authorization: 'Token token=' + app.models.current_user.get('token')} 
     }) 
     }) 
     .done(function() { 
     // ... 
     // initializing the backbone app and models 
     // ... 
     }); 
    } 
}; 

一個微小的細節需要注意與jQuery的隱含的done()回調順序做。在這段代碼中,你只做了4個靜態步驟。如果您需要特定的訂購併且動態添加.done()回調,則可能不確定哪個添加了其他回調。上面這個例子的作用是因爲jQuery按照它們添加的順序運行.done()回調。如果你沒有這個假設,你必須通過jQuery的.then()函數代替/過濾每個完成步驟的延遲。這樣,每個中間步驟只有1個回調函數,只有1個回調函數返回另一個回調函數,以便下一個回調函數附加1和1回調函數......等等。