2013-01-07 28 views
2

我正在使用backbone.js作爲應用程序的前端。其中一個導航規則與身份驗證流程非常相似:應用程序只應呈現用戶請求的視圖(如果有某個可用信息)。否則,應該呈現另一個視圖。信息是否可用可以通過查詢服務器來決定。我迄今爲止嘗試:如何定義骨幹路由的默認行爲?

//Router table definition, etc... 

    var initialize = function(){ 

    var appRouter = new AppRouter; 

    appRouter.on('route:somePage', withInfo(function(){ 
     //render view for 'somePage' 
    })); 

    ... 

的​​功能如下:

function withInfo(f) { 
    $.ajax({ 
    type: 'GET', 
    dataType: 'json', 
    url: '/path/to/info', 
    success: function (data, status, request) { 
     var info = $.parseJSON(request.responseText); 
     if (info){ 
     f.call(); 
     } else { 
     var defaultView = new DefaultView(); 
     defaultView.render(); 
     } 
    } 
    }); 
} 

基本上,我想要做的就是定義一個默認行爲高階函數。如果默認行爲不適用,它應該調用另一個函數(在上面的代碼中命名爲f)。但這並不如預期的那樣。實際作爲參數傳遞的函數並不總是在第一個代碼片段中聲明的函數。

是否有另一種方法可以做到這一點?

+0

你不使用一個骨幹型號檢索和存儲信息數據的原因嗎? –

+0

不,沒有。但是這對目前的問題有什麼影響嗎? –

+0

不確定,但在我看來,你的withInfo方法重複已經由Backbone的模型結構處理的邏輯。假設信息數據只需要從服務器端檢索一次,爲什麼不將其存儲在模型中,並將基於模型上適當值的條件移動到路由函數? –

回答

1

這可能不是最好的,「幹」的方式,但它的工作原理並不需要任何Backbone插件,除了已經包含的Underscore庫。這使用_.wrap函數,它將第一個函數包裝在第二個函數中。

appRouter.on('route:somePage', _.wrap(function(){ 
    #render view for some Page 
}, withInfo)); 

,爲​​功能,唯一改變的線是有條件的:

function withInfo(f) { 
    $.ajax({ 
    type: 'GET', 
    dataType: 'json', 
    url: '/path/to/info', 
    success: function (data, status, request) { 
     var info = $.parseJSON(request.responseText); 
     if (info){ 
     f(); 
     } else { 
     var defaultView = new DefaultView(); 
     defaultView.render(); 
     } 
    } 
    }); 
}