typescript - Angular-tjänst: AppleID är inte definierad efter att Apple-skriptet har laddats
Detta är mitt första inlägg här, jag försökte hitta en lösning men hittade inget relaterat problem. Jag försöker implementera AppleConnect i min Angular 8-app. Så här gör jag:
Jag skapade en appleService.ts-fil som dynamiskt skapar Apple-scriptet och lägger till det i DOM, och sedan initialiserar AppleID.auth när scriptet är laddat.
import {isBrowser} from '../../appModule/platformUtil';
import {KartableConfig} from '../../commonModule/services/kartableConfig';
import {Injectable} from '@angular/core';
import {KartableLogger} from '../../appModule/services/KartableLogger';
import { environment } from '../../environments/environment';
declare let AppleID : any;
@Injectable({
providedIn: 'root',
})
export class AppleService {
applePromise: Promise<void>;
constructor(private config: KartableConfig,
private logger: KartableLogger) {
}
private initApple(redirectUri: string): Promise<void> {
if (!isBrowser()) {
this.logger.error('Apple init called server side');
return null;
}
if (!this.applePromise) {
this.applePromise = new Promise(resolve => {
const appleConnectLoaded = () => {
AppleID.auth.init({
clientId : environment.appleConnectClientId,
scope : 'name email',
redirectURI : redirectUri,
usePopup : true
});
resolve();
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s);
js.type = 'text/javascript';
js.id = id;
js.async = true;
js.src = "https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/fr_FR/appleid.auth.js";
fjs.parentNode.insertBefore(js, fjs);
js.onload = appleConnectLoaded();
}(document, 'script', 'apple-connect'));
});
}
return this.applePromise;
}
public login(redirectUri: string): Promise<{ [key: string]: string }> {
return new Promise((resolve: Function, reject: Function) => {
this.initApple(redirectUri).then(() => {
document.addEventListener('AppleIDSignInOnSuccess', (data) => {
resolve(data);
});
document.addEventListener('AppleIDSignInOnFailure', (error) => {
reject('Apple connect failed');
});
});
});
}
}
Första delen går bra, men jag får följande fel:
ReferenceError: AppleID is not defined at appleConnectLoaded (appleService.ts:34)
Det märkliga är att när jag skriver AppleID i min webbläsarkonsol, så finns det. Jag missar något här men kan inte sätta fingret på det... Tack för din hjälp!
Svar #1
Jag löste det genom att skicka callbacken som en pil;
let appleConnectLoaded = (AppleID) => {
AppleID.auth.init({
clientId : "com.something",
scope : 'name email',
redirectURI : window.location.protocol + "//" + window.location.hostname + "/apple",
usePopup : true
});
resolve();
};
(function(d, s, cb){
var js, fjs = d.getElementsByTagName(s)[0];
js = d.createElement(s);
js.src = "//appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/sv_SE/appleid.auth.js";
fjs.parentNode.insertBefore(js, fjs);
js.addEventListener("load", () => cb(AppleID));
}(document, 'script', appleConnectLoaded));
