2014-01-26 37 views
0

嗨我希望能夠延遲我的應用程序的一點點這裏是我的意思。在致電服務器之前啓動屏幕disapears完成

這是我的殼觀點:

<div> 
<!-- ko compose: { view : header }--> 
<!--/ko--> 
<!-- ko compose: { view : content }--> 
<!--/ko--> 

這是我的殼視圖模型:

define(['plugins/router', 'services/dataService' , 'models/appViewModels'], 
    function (router,dataService , appViewModels) { 

     var vm = { 
      header: ko.observable(), 
      content: ko.observable(), 
      activate: activate 
     }; 

     function activate() { 
      setActivePage(); 
     } 


     function setActivePage() { 
      $.when(dataService.account.isAuthenticated()) 
       .done(function(isAuthenticated) { 
        setDefaultDisplayPage(isAuthenticated) 
       }).fail(function(data) { 
        alert(data); 
       }); 
     } 

     function setDefaultDisplayPage(isAuthenticated) { 
      if (isAuthenticated) { 
       setHeaderAndContentObservables(appViewModels.header.generalHeader, appViewModels.content.homeContent); 
      } else { 
       setHeaderAndContentObservables(appViewModels.header.loginHeader, appViewModels.content.loginContent); 
      } 
     } 
} 

的振振有辭我使用的觀測,而不是一個路徑的字符串表示我查看是因爲在我的shell中,我決定是否應該將我的用戶發送到登錄頁面或主頁 。

這完美的作品,除了在時間,它需要從服務器獲取isAuthenticated財產閃屏自敗,直到數據被收到的用戶只能等待一個空白頁上的時間一兩件事。

現在我可以嘗試獲取main.js文件中的數據並緩存它,但是我認爲main.js應該只具有應用程序配置責任。

有沒有什麼辦法可以在shell實際得到綁定和啓動屏幕消失之前,對服務器調用數據?

+1

您可以在激活的調用中從shell中返回一個承諾。它看起來像你幾乎在那裏,但你沒有回報它。 Durandal生命週期允許您返回該承諾,並且會在完成「加載」之前等待承諾解決。我相信你可以用它來使用jQuery的承諾,但是如果你使用Q.js,你可以使用類似return q.All(); –

回答

2

我同意PW Kad的建議。 Durandal包裝Q.js. 我有相同的場景 [檢查用戶是否通過認證=>通過Durandal路由器從數據庫加載用戶菜單,返回承諾=>加載內容] 但是,我在代碼中看不到路由器。

不管怎麼說,在激活的方法,你可以做這樣的事情:

var vm = { 
      header: ko.observable(), 
      content: ko.observable(), 
      isAuthenticated: ko.observable(false), 
      activate: activate 
     }; 

function activate() { 

      return Authenticate() 
       .then(setDefaultDisplayPage) 
       .fail(failed); 
     } 
function Authenticate() { 
// pass an observable as a parameter to your function 
       dataService.account.isAuthenticated(isAuthenticated); 
       return Q.resolve(); 
       } 
     function setDefaultDisplayPage() {   
     if(isAuthenticated()) { 
    setHeaderAndContentObservables(appViewModels.header.generalHeader,appViewModels.content.homeContent); 
} 
     else { setHeaderAndContentObservables(appViewModels.header.loginHeader,appViewModels.content.loginContent); 
     } 
    } 
    function failed(){ 
// failure code goes here 
} 

這樣,你的視圖模型將不會綁定到數據是從服務器獲取。

相關問題