我想在我的Angular应用程序中包含Telegram login widget。为此,您必须包括以下脚本:
<script async src="https://telegram.org/js/telegram-widget.js?5"
data-telegram-login="bot_name" data-size="large"
data-auth-url="https://myurl.example/api/telegram"
data-request-access="write"></script>
Angular模板中的嵌入脚本为not allowed,它将被删除。 (但是,可以通过this hack包含脚本标签。)
是否有包含此小部件的非骇客方式?
答案 0 :(得分:0)
不渲染模板代码中的script
标签确实是Angular团队的设计选择。
因此,方法是:
head
中将其删除,否则不适合添加到OnDestroy
中。最好在组件中添加正确的DOM元素。答案 1 :(得分:0)
我为Telegram登录小部件创建了以下组件:
该组件动态创建脚本标签,并添加回调函数loginViaTelegram(user)
:
@Component({
selector: 'app-telegram-login-widget',
template: `
<div #script style.display="none">
<ng-content></ng-content>
</div>`,
styleUrls: ['./telegram-login-widget.component.css']
})
export class TelegramLoginWidgetComponent implements AfterViewInit {
@ViewChild('script', {static: true}) script: ElementRef;
convertToScript() {
const element = this.script.nativeElement;
const script = document.createElement('script');
script.src = 'https://telegram.org/js/telegram-widget.js?5';
script.setAttribute('data-telegram-login', environment.telegramBotName);
script.setAttribute('data-size', 'large');
// Callback function in global scope
script.setAttribute('data-onauth', 'loginViaTelegram(user)');
script.setAttribute('data-request-access', 'write');
element.parentElement.replaceChild(script, element);
}
ngAfterViewInit() {
this.convertToScript();
}
}
我在专用服务的loginViaTelegram
对象(全局空间)中添加了回调函数window
:
@Injectable({
providedIn: 'root'
})
export class TelegramLoginService {
init() {
window['loginViaTelegram'] = loginData => this.loginViaTelegram(loginData);
}
private loginViaTelegram(loginData: TelegramLoginData) {
// If the login should trigger view changes, run it within the NgZone.
this.ngZone.run(() => process(loginRequest));
}
}