2014-05-12 39 views
1

我們需要以非SPA模式加載一些頁面,而其他頁面則以SPA模式加載。例如,主頁和關於頁面應該是非SPA,而其他頁面應該是SPA。Angular JS - 非單頁路由SPA

$ locationProvider.html5Mode(true);使所有頁面SPA,即使路由未找到。不添加該行使所有頁面都不是SPA。

如何設置路由,以便如果路由不存在,應該從服務器獲取頁面?即不是推送狀態。

此外,我們正在使用ui路由器。

+0

我會說這樣的事情是不可能使用角度路由 – Dalorzo

回答

0

行,所以我調整了以前的答案,並找到了解決辦法

基本上,當服務器呼籲SPA或非SPA頁面,該頁面需要以某種方式表示,我選擇什麼樣的模式,它是在運行一個JavaScript變量爲

var html5mode = true;// for SPA, set to false for non SPA. Emit this from the server. 

在您的routedefs.js或任何你有定義的路線。

// enable html5Mode for pushstate ('#'-less URLs) 
if (html5mode) { 
    $urlRouterProvider.otherwise(function ($injector, $location) { 
     // reload if route not found. 
     window.location = window.location; 
    }); 

    $locationProvider.html5Mode(true); 
} else { 
    $locationProvider.html5Mode(false); 
} 
+0

你可以$ locationProvider.html5mode(html5mode)並消除'其他'。只是說。 – Rap

1

使用ui路由器,您可以有其他狀態。在原本的狀態,你可以添加一個決心,可以做一個請求到服務器來處理路由:

$urlRouterProvider.otherwise("otherwise"); 

$stateProvider 
    .state('otherwise', { 
    url: '/otherwise', 
    template: 'some html', 
    resolve : { 
     serverPage: function servePage() { 
     //http request to the server to fetch and redirect. 
     } 
    } 
    }) 
+0

這沒有奏效。出於某種原因,這會禁用html5Mode,然後一切都會觸發服務器。 – nsdiv

1

不知道爲什麼用「否則」狀態較早的答案沒有工作,因爲這似乎是有前途的。如果您有多個非spa頁面要去,並且您想要管理路由中的所有內容,那麼您也可以僅將一個函數傳遞給otherwise(),而不是定義一個單獨的狀態,如下所示:

$urlRouterProvider.otherwise(function($injector, $location){ 
    // redirect here, for example… 
    window.location.href= window.location.origin + $location.url(); 
}); 

因此,如果用戶瀏覽下面的路線

http://mydomain.com/spa#/nonspa

它會被重定向到

http://mydomain.com/nonspa

(假設'nonspa'不在有效路線中)

也就是說,我可能只是直接鏈接到非spa頁面而不是通過路由代碼 - 看起來更簡單和更快。

+0

不幸的是,這會導致無限重新加載。如果我直接點擊http://mydomain.com/nonspa,在頁面加載之後,否則執行函數,導致重新加載。 – nsdiv

1

會添加目標=「_自我」屬性錨標記允許你從SPA頁轉到非SPA頁?