Angular-2 : 根据配置更改网站图标
Angular-2 : Change favicon icon as per configuration
我正在我的应用程序中呈现动态页面、菜单和其他项目。
我还想根据管理员配置更改图标。
例如,如果我的 页面加载 配置的图标是 xyz.png
,那么它将显示 xyz.png
作为图标。
如下图所示,新的图标应该替换 "Test Application" 附近的现有图标。现在,它显示默认的图标,如下所示。
index.html
:
<!DOCTYPE html>
<html>
<head>
<base href="/MyFirstAngular2/" >
<title>Angular 2</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" id="appIcon" href="/favicon.ico" type="image/x-icon" />
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet" />
<link href="css/Site.css" rel="stylesheet" />
<script src="scripts/jquery-2.2.1.min.js"></script>
<script src="scripts/bootstrap.min.js"></script>
<script src="scripts/main/shim.min.js"></script>
<script src="scripts/main/zone.js"></script>
<script src="scripts/main/reflect-metadata.js"></script>
<script src="scripts/main/system.src.js"></script>
<script src="scripts/system.config.js"></script>
<script>
document.SYSTEMJS_CONFIG.map.app = 'scripts/configs';
document.SYSTEMJS_CONFIG.packages.app = { main: 'application.ts', defaultExtension: 'ts' };
System.config(document.SYSTEMJS_CONFIG);
System.import('app').catch(function (err) {
console.error(err);
});
</script>
</head>
<body>
<application></application>
</body>
</html>
我在每个组件加载时都会得到一个新的网站图标,因此您只需更改任何组件调用中的网站图标即可。
然后您可以使用 javascript 通过将以下函数添加到您的 <script>
块来设置每个配置的图标:
<script>
document.SYSTEMJS_CONFIG.map.app = 'scripts/configs';
document.SYSTEMJS_CONFIG.packages.app = { main: 'application.ts', defaultExtension: 'ts' };
System.config(document.SYSTEMJS_CONFIG);
System.import('app').catch(function (err) {
console.error(err);
});
//here favicon is set
(function() {
var link = document.createElement('link');
link.type = 'image/x-icon';
link.rel = 'shortcut icon';
link.href = '../path/to/xyz.png'; //path to selected favicon file
document.getElementsByTagName('head')[0].appendChild(link);
}());
</script>
在 <application></application>
之外,您只能使用 Title class:
import {Title} from '@angular/platform-browser';
export class YourClass(){
constructor(private title: Title){}
yourNameMethod(){
this.title.setTitle('your title');
}
}
app.module.ts
import {NgModule} from '@angular/core';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {BrowserModule} from '@angular/platform-browser';
import {AppComponent} from './path/to/app.component';
import {AppService} from './path/to/app.service';
// ....
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
// ...
],
bootstrap: [AppComponent],
providers: [AppService]
})
export class AppModule {}
platformBrowserDynamic().bootstrapModule(AppModule);
app.service.ts
import { Injectable, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import {Http, Response} from '@angular/http';
import {Observable} from 'rxjs/Rx';
@Injectable()
export class AppService {
constructor(@Inject(DOCUMENT) private _document: HTMLDocument, private http:Http)
getAppDetails(appId: string) {
return this.http.post(url, appId)
.map((response: Response) => {
let details = response.json();
return details;
})
.do(data => console.log(data))
.catch(this.handleError);
}
private handleError(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
setAppFavicon(id: string, basepath: string, icon: string){
this._document.getElementById('appFavicon').setAttribute('href', basepath+"/"+ icon);
}
}
app.component.ts
:
import {Component} from "@angular/core";
import {AppService} from "../path/to/app.service";
@Component({
selector: 'application',
templateUrl: './path/to/app.component.html'
})
export class ApplicationComponent {
details: any;
constructor(private appService: AppService) {
this.details = appService.getAppDetails(id);
appService.setAppFavicon(id,basepath,this.details.icon);
}
}
在 index.html 中设置 link 标签
<link id="appFavicon" rel="icon" type="image/x-icon" href="favicon.ico">
并在代码中的某处导入
import { Component, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
constructor(@Inject(DOCUMENT) private _document: HTMLDocument) {}
并像这样使用它
this._document.getElementById('appFavicon').setAttribute('href', '/your/icon/path.ico');
Angular 5.0 <
import { DOCUMENT } from '@angular/platform-browser';
我们在后端有 nodejs 运行,我们有 URL 需要显示的特定图标。
在app.js中我们实现了一个resolveConfig()
函数,这将帮助我们获得url特定配置。
上述函数的 return 值用于获取图标调用,如下所示。
app.js
app.get('/favicon.ico',(req,res)=> {
let key = resolveConfig(req.hostname);
switch (key) {
case 'a':
res.sendFile(__dirname + '/dist/assets/a.ico');
break;
case 'b':
res.sendFile(__dirname + '/dist/assets/b.ico');
break;
}
});
index.html
<link rel="icon" type="image/x-icon" href="favicon.ico"/>
*如果你的后端有 nodejs,这可能会有用。
效果很好,没有注入,没有后顾之忧,简单的代码。但它会成为您 angular 项目中的纯 javascript。
document.getElementById('appFavicon').setAttribute('href', '/your/icon/path.ico');
我正在我的应用程序中呈现动态页面、菜单和其他项目。 我还想根据管理员配置更改图标。
例如,如果我的 页面加载 配置的图标是 xyz.png
,那么它将显示 xyz.png
作为图标。
如下图所示,新的图标应该替换 "Test Application" 附近的现有图标。现在,它显示默认的图标,如下所示。
index.html
:
<!DOCTYPE html>
<html>
<head>
<base href="/MyFirstAngular2/" >
<title>Angular 2</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" id="appIcon" href="/favicon.ico" type="image/x-icon" />
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet" />
<link href="css/Site.css" rel="stylesheet" />
<script src="scripts/jquery-2.2.1.min.js"></script>
<script src="scripts/bootstrap.min.js"></script>
<script src="scripts/main/shim.min.js"></script>
<script src="scripts/main/zone.js"></script>
<script src="scripts/main/reflect-metadata.js"></script>
<script src="scripts/main/system.src.js"></script>
<script src="scripts/system.config.js"></script>
<script>
document.SYSTEMJS_CONFIG.map.app = 'scripts/configs';
document.SYSTEMJS_CONFIG.packages.app = { main: 'application.ts', defaultExtension: 'ts' };
System.config(document.SYSTEMJS_CONFIG);
System.import('app').catch(function (err) {
console.error(err);
});
</script>
</head>
<body>
<application></application>
</body>
</html>
我在每个组件加载时都会得到一个新的网站图标,因此您只需更改任何组件调用中的网站图标即可。
然后您可以使用 javascript 通过将以下函数添加到您的 <script>
块来设置每个配置的图标:
<script>
document.SYSTEMJS_CONFIG.map.app = 'scripts/configs';
document.SYSTEMJS_CONFIG.packages.app = { main: 'application.ts', defaultExtension: 'ts' };
System.config(document.SYSTEMJS_CONFIG);
System.import('app').catch(function (err) {
console.error(err);
});
//here favicon is set
(function() {
var link = document.createElement('link');
link.type = 'image/x-icon';
link.rel = 'shortcut icon';
link.href = '../path/to/xyz.png'; //path to selected favicon file
document.getElementsByTagName('head')[0].appendChild(link);
}());
</script>
在 <application></application>
之外,您只能使用 Title class:
import {Title} from '@angular/platform-browser';
export class YourClass(){
constructor(private title: Title){}
yourNameMethod(){
this.title.setTitle('your title');
}
}
app.module.ts
import {NgModule} from '@angular/core';
import {platformBrowserDynamic} from '@angular/platform-browser-dynamic';
import {BrowserModule} from '@angular/platform-browser';
import {AppComponent} from './path/to/app.component';
import {AppService} from './path/to/app.service';
// ....
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
// ...
],
bootstrap: [AppComponent],
providers: [AppService]
})
export class AppModule {}
platformBrowserDynamic().bootstrapModule(AppModule);
app.service.ts
import { Injectable, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import {Http, Response} from '@angular/http';
import {Observable} from 'rxjs/Rx';
@Injectable()
export class AppService {
constructor(@Inject(DOCUMENT) private _document: HTMLDocument, private http:Http)
getAppDetails(appId: string) {
return this.http.post(url, appId)
.map((response: Response) => {
let details = response.json();
return details;
})
.do(data => console.log(data))
.catch(this.handleError);
}
private handleError(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
setAppFavicon(id: string, basepath: string, icon: string){
this._document.getElementById('appFavicon').setAttribute('href', basepath+"/"+ icon);
}
}
app.component.ts
:
import {Component} from "@angular/core";
import {AppService} from "../path/to/app.service";
@Component({
selector: 'application',
templateUrl: './path/to/app.component.html'
})
export class ApplicationComponent {
details: any;
constructor(private appService: AppService) {
this.details = appService.getAppDetails(id);
appService.setAppFavicon(id,basepath,this.details.icon);
}
}
在 index.html 中设置 link 标签
<link id="appFavicon" rel="icon" type="image/x-icon" href="favicon.ico">
并在代码中的某处导入
import { Component, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
constructor(@Inject(DOCUMENT) private _document: HTMLDocument) {}
并像这样使用它
this._document.getElementById('appFavicon').setAttribute('href', '/your/icon/path.ico');
Angular 5.0 <
import { DOCUMENT } from '@angular/platform-browser';
我们在后端有 nodejs 运行,我们有 URL 需要显示的特定图标。
在app.js中我们实现了一个resolveConfig()
函数,这将帮助我们获得url特定配置。
上述函数的 return 值用于获取图标调用,如下所示。
app.js
app.get('/favicon.ico',(req,res)=> {
let key = resolveConfig(req.hostname);
switch (key) {
case 'a':
res.sendFile(__dirname + '/dist/assets/a.ico');
break;
case 'b':
res.sendFile(__dirname + '/dist/assets/b.ico');
break;
}
});
index.html
<link rel="icon" type="image/x-icon" href="favicon.ico"/>
*如果你的后端有 nodejs,这可能会有用。
效果很好,没有注入,没有后顾之忧,简单的代码。但它会成为您 angular 项目中的纯 javascript。
document.getElementById('appFavicon').setAttribute('href', '/your/icon/path.ico');