Google Picker API сталкивается с несколькими сборщиками - PullRequest
0 голосов
/ 19 февраля 2019

работает над инструментом для работы с google drive, и для одной операции необходимо иметь два средства выбора файлов и работать с результатами.Это операция «перемещение», поэтому первая - выбрать файл для перемещения, а вторая - для папки, в которую должен быть перемещен файл.У меня оба средства выбора определены следующим образом:

btn_driveMove.on('click', (e) => {
        console.log('btn_driveMove(): called.');
        let tk = getLayeredStorage(currentUserEmail, 'access_token');
        if(tk.indexOf('\\') !== -1) tk = tk.replace(/\\/g,'');
        if(tk.indexOf('\"') !== -1) tk = tk.replace(/"/g, '');

        gapi.client.setToken({access_token: tk});

        gapi.load('picker', () => {
        const selectFile = new google.picker.PickerBuilder()
                .addView(new google.picker.DocsView().setSelectFolderEnabled(true))
                .setOAuthToken(gapi.client.getToken().access_token)
                .setCallback(fileSelectedCallback)
                .build();
        selectFile.setVisible(true);
    });

});

function folderSelectedCallback(folderData, fileData) {
    console.log('folderSelectedCallback(): called.');
    console.log('File Data: ', fileData);
    console.log('Folder Data: ', folderData);
    const files = fileData.docs;
    const folder = folderData.docs[0];

    files.forEach(f => {
        gapi.client.drive.files.update({
            addParents: folder.id,
            fileId: f.id,
            removeParents: f.parentId
        }).then(res => {
            console.dir(res);
        });
    });
}

function fileSelectedCallback(fileData) {
    console.log('FileSelectedCallback(): File Data: ', fileData);
    const folderPicker = new google.picker.PickerBuilder()
            .addView(new google.picker.DocsView()
                            .setIncludeFolders(true)
                            .setMimeTypes('application/vnd.google-apps.folder')
                            .setSelectFolderEnabled(true))
            .setOAuthToken(gapi.client.getToken().access_token)
            .setCallback((data) => folderSelectedCallback(data, fileData))
            .build();
    folderPicker.setVisible(true);
}

Проблема в том, что иногда средство выбора папки отображается поверх средства выбора файлов.Код по-прежнему работает правильно, но выглядит ужасно, когда всплывают два средства выбора, закрывают одно, выбирают файл в другом и папка один возвращается.Просто не так, как я хочу, чтобы это было представлено ...

1 Ответ

0 голосов
/ 20 февраля 2019

Обратный вызов, установленный в .setCallback(), вызывается не один раз, а каждый раз, когда происходит изменение с помощью сборщика.Это предназначено для того, чтобы позволить разработчику настроить определенные действия для определенных событий в рабочем процессе Picker.

В данном случае нет ничего, что действительно нужно делать с сохраненными действиями 'cancelled' или 'loaded'в data.action.Реальный, который нас интересует, это 'picked'.Это означает, что пользователь выбрал что-то в Picker.(Файл, папка, дружественный инопланетянин и т. Д.)

Нам просто нужно обернуть тело обработчика обратного вызова простым оператором if, подобным этому:

function pickerCallback(data){
    if(data.action === 'picked'){
        ....... do some things ......
    }
}

С этим первымобратный вызов должен выглядеть следующим образом и гарантирует, что второй сборщик не будет отображаться до того, как первый использовался / был утилизирован.

function fileSelectedCallback(fileData) {
    console.log('FileSelectedCallback(): File Data: ', fileData);
    if(fileData.action === 'picked'){
        const folderPicker = new google.picker.PickerBuilder()
                .addView(new google.picker.DocsView()
                                .setIncludeFolders(true)
                                .setMimeTypes('application/vnd.google-apps.folder')
                                .setSelectFolderEnabled(true))
                .setOAuthToken(gapi.client.getToken().access_token)
                .setCallback((data) => folderSelectedCallback(data, fileData))
                .build();
        folderPicker.setVisible(true);
    }
}
...