2014-05-12 38 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页?