javascript - Angular 6 - Google Picker API-popup
Kan bara komma åt Google Picker då och då. Google Picker-popupen öppnas inte varje gång jag öppnar applikationen.
Jag implementerar Google Picker API i Angular 6. Jag har sparat en separat fil för logiken bakom att ansluta till Google API i Angulars assets-mapp och med hjälp av document.createElement("script") har jag bifogat javascript-filen. Och jag har en ankartagg för att getElementById i app.component.html.
app.component.html
<a routerLink="/" id="AllFilePick" #AllFilePick> Button </a>
app.component.ts
import { Component, ViewChild, ElementRef, OnInit } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
@ViewChild('AllFilePick') AllFilePick: ElementRef;
constructor(private elementRef: ElementRef) { }
ngOnInit() {
var s1 = document.createElement("script");
s1.type = "text/javascript";
s1.src = "../assets/api-script.js";
this.elementRef.nativeElement.appendChild(s1);
var s2 = document.createElement("script");
s2.src = "https://www.google.com/jsapi?key=<API_KEY>";
this.elementRef.nativeElement.appendChild(s2);
var s3 = document.createElement("script");
s3.src = "https://apis.google.com/js/client.js?onload=SetPicker";
this.elementRef.nativeElement.appendChild(s3);
// console.log(this.AllFilePick.nativeElement);
console.log(s1);
console.log(s2);
console.log(s3);
}
}
Jag försökte till och med använda ngAfterViewInit, konstruktor för att lägga till skript-taggen.
assets/api-script.js
function SetPicker() {
var picker = new FilePicker(
{
apiKey: ‘<API_KEY>’,
clientId: ‘<CLIENT_ID>’,
buttonEl: document.getElementById("AllFilePick"),
onClick: function (file) {
PopupCenter('https://drive.google.com/file/d/' + file.id + '/view', "", 1026, 500);
}
}
);
}
function PopupCenter(url, title, w, h)
{
//.....
}
function FilePicker(User)
{
//Configuration
//....
}
Ovanstående fullständiga version av koden fungerar korrekt men popup-fönstret öppnas sällan, då och då. Popupen triggas endast efter att applikationen har uppdaterats flera gånger eller när applikationen öppnas nästa dag. Väljaren fungerar inte regelbundet i Angular.
Svar #1
I index.html
<script type="text/javascript" src="https://apis.google.com/js/api.js"></script>
<script src="https://apis.google.com/js/platform.js"></script>
I komponentens mall (.html) fil.
<button (click)="loadGoogleDrive()"><G-Drive</button>I komponenten (.ts-fil).
import { Component } from '@angular/core';
declare var gapi: any;
declare var google: any;
@Component({
selector: 'app-selector',
templateUrl: './app-selector.component.html',
styleUrls: ['./app-selector.component.css']
})
export class GoogleDriveSelectorComponent {
developerKey = 'developer/API key here';
clientId = "client_id"
scope = [
'profile',
'email',
'https://www.googleapis.com/auth/drive'//insert scope here
].join(' ');
pickerApiLoaded = false;
oauthToken?: any;
loadGoogleDrive() {
gapi.load('auth', { 'callback': this.onAuthApiLoad.bind(this) });
gapi.load('picker', { 'callback': this.onPickerApiLoad.bind(this) });
}
onAuthApiLoad() {
gapi.auth.authorize(
{
'client_id': this.clientId,
'scope': this.scope,
'immediate': false
},
this.handleAuthResult);
}
onPickerApiLoad() {
this.pickerApiLoaded = true;
}
handleAuthResult(authResult) {
let src;
if (authResult && !authResult.error) {
if (authResult.access_token) {
let view = new google.picker.View(google.picker.ViewId.DOCS);
view.setMimeTypes("image/png,image/jpeg,image/jpg,video/mp4");
let pickerBuilder = new google.picker.PickerBuilder();
let picker = pickerBuilder.
enableFeature(google.picker.Feature.NAV_HIDDEN).
setOAuthToken(authResult.access_token).
addView(view).
addView(new google.picker.DocsUploadView()).
setCallback(function (e) {
if (e[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
let doc = e[google.picker.Response.DOCUMENTS][0];
src = doc[google.picker.Document.URL];
console.log("Document selected is", doc,"and URL is ",src)
}
}).
build();
picker.setVisible(true);
}
}
}
}Svar #2
I Index.html
<script type="text/javascript" src="https://apis.google.com/js/api.js?onload=loadPicker"></script>
Skapa en tjänst som googleDrivePickerService (.service.ts)
import {Injectable} from '@angular/core';
declare const gapi: any;
declare const google: any;
@Injectable({
providedIn: 'root'
})
export class GoogleDrivePickerService {
private clientId = 'YOUR_CLIEND_ID';
private apiKey = 'YOUR_API_KEY';
private appId = 'YOUR_APP_ID';
private scope = 'https://www.googleapis.com/auth/drive.file',
private oauthAccessToken = null;
private pickerApiLoaded = false;
private pickerCallback = null;
public open(callback): void {
this.pickerCallback = callback;
gapi.load('auth', {'callback': this.onAuthApiLoad.bind(this)});
gapi.load('picker', {'callback': this.onPickerApiLoad.bind(this)});
}
private onAuthApiLoad(): void {
gapi.auth.authorize({
'client_id': this.clientId,
'scope': this.scope,
'immediate': false,
}, this.handleAuthResult.bind(this));
}
private onPickerApiLoad(): void {
this.pickerApiLoaded = true;
this.createPicker();
}
private handleAuthResult(authResult): void {
if (authResult && !authResult.error) {
this.oauthAccessToken = authResult.access_token;
this.createPicker();
}
}
private createPicker(): void {
if (this.pickerApiLoaded && this.oauthAccessToken) {
let view = new google.picker.View(google.picker.ViewId.DOCS);
let picker = new google.picker.PickerBuilder()
.enableFeature(google.picker.Feature.NAV_HIDDEN)
.enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
.setAppId(this.appId)
.setOAuthToken(this.oauthAccessToken)
.addView(view)
.addView(new google.picker.DocsUploadView())
.setDeveloperKey(this.apiKey)
.setCallback(this.pickerCallback)
.build();
picker.setVisible(true);
}
}
}
I din komponent (.ts), importera tjänsten och lägg till den i konstruktören och slutligen kalla på open-funktionen med en callback.
import {GoogleDrivePickerService} from '../services/googledrivepicker.service';
constructor(
private googleDrivePickerService: GoogleDrivePickerService
){}
openGoogleDrivePicker(): void {
this.googleDrivePickerService.open((data) => {
if (data.action === 'picked') {
console.log('Picked', data.docs);
}
});
}
