根据URL的动态样式表

时间:2018-09-10 07:43:23

标签: angular

我正在使用一个服务门户,该门户允许客户端登录并发送大量SMS /文本消息,电子邮件和推送消息。我们在生产中运行一个前端实例。每个客户端都通过相同的URL http://www.messagingportal.com到达相同的门户。

但是,每个客户端都使用自己的公司名称(即http://www.client1.messagingportal.comhttp://www.client2.messagingportal.com)作为URL的前缀。

基于URL中的该前缀,我们提供不同的样式表,其中包含与该客户品牌相关的外观。目前,我使用一些附加在我的角度应用程序中的index.html上的原始JavaScript来执行此操作。这显然是一种可怕的做法。参见下面的代码:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>GVI Portal</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
  <app-root></app-root>
</body>
<script>
  if((location.hostname.toLowerCase().indexOf("client1")) > -1) {
    document.write("<link href=\"\\assets\\css\\skins\\client1.css\" rel=\"stylesheet\">");
  }
</script>
</html>

因此,如果客户端导航到其URL http://www.client1.messagingportal.com,则样式表client1.css将附加到DOM。它包含覆盖当前样式表的CSS。颜色,字体,徽标等...

使用Angular在我的应用程序中有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

也许您可以更改客户的URL以使用某些标准模式,例如http://www.messagingportal.com/client1

然后,您将client定义为路由定义中的动态参数,例如:

{ path: '/:client', component: ... }

例如,使用ngSwitch在组件和模板中使用此变量

<!doctype html>
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>GVI Portal</title>
 <base href="/">
 <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
 <app-root></app-root>
</body>
<script [ngSwitch]="client">
 <link href="\assets\css\skins\client1.css\" rel=\"stylesheet\" *ngSwitchCase="client == client1">;
</script>
</html>

答案 1 :(得分:0)

这本质上是基于客户端的主题。正常的方法是像这样向html标签添加一个类:

您将使用基于子域的JavaScript添加此类。然后,您只需添加所有样式表,它们中的样式将如下所示:

.logo {
  display:none;
}

.client1-theme .logo.client1 {
  display:block;
}

HTML:

<img src="...." class="logo client1"> 
<img src="...." class="logo client2">