2016-06-24 8 views
2

Ich versuche, die v7 Microsoft Onedrive SDK here zu implementieren, aber wenn ich die Syntax für die Event-Handler-Funktionen in dem Beispiel-Array, auf dieser Seite verwenden Sie bekomme ich diesen Fehler:MS OneDrive JavaScript SDK-Handler nicht global?

Uncaught Error: [OneDriveSDK Error] function was missing and not optional

Dies ist mein Code :

<script type="text/javascript"> 

     function od_success(files) { 
      console.log('OneDrive Launch Success!'); 
     } 

     function od_error(e) { 
      console.log('OneDrive Launch Failed!'); 
     } 

     function od_cancel() { 
      console.log('OneDrive Launch Cancelled!'); 
     } 

     function launchOneDrivePicker() { 
      var odOptions = { 
       clientId: <?php echo '"' . esc_attr(get_option('rod_api_key')) . '"'; ?>, 
       action: "query", 
       openInNewWindow: false, 
       oneDriveFilePickerSuccess: function(files) { od_success(files) }, 
       oneDriveFilePickerCancel: function() { od_cancel() }, 
       oneDriveFilePickerError: function(e) { od_error(e) } 
      }; 

      OneDrive.open(odOptions); 
     } 

     </script> 

(. Hinweis: Dies alles im Rahmen einer Wordpress-Seite geschieht und im Kopf ausgespuckt wird, während das SDK in der Fußzeile der Warteschlange gestellt wird)

ich habe das gerade Aufruf versuchte benannte functi ons, etwa so:

oneDriveFilePickerSuccess: od_success(files), 
oneDriveFilePickerCancel: od_cancel, 
oneDriveFilePickerError: od_error(e) 

Dies funktioniert nur, ohne den Weg params (zum Beispiel od_success()), aber in diesem Fall ruft sie alle drei in Folge und gibt dann die obigen Fehler. Wenn ich dem Anruf Parameter wie oben hinzufüge, sagt es mir files ist undefined.

Vielen Dank im Voraus für die Hilfe

+0

die Meldung genaue Fehler bieten könnte? –

+0

Danke Simon, ich habe meinen Beitrag aktualisiert – RoboRob

Antwort

1

Siehe in der Dokumentation:

var oneDriveFilePickerError = 
function() { 
    console.log('OneDrive Launch Failed!'); 
} 

var oneDriveFilePickerSuccess = 
function (files) { 
    console.log('OneDrive Launch Success!'); 
} 

var oneDriveFilePickerCancel = 
function (e) { 
    console.log('OneDrive Launch Cancelled!'); 
} 

function launchOneDrivePicker() { 
    var odOptions = { 
     clientId: '...', 
     action: "query", 
     openInNewWindow: false, 
     success: 'oneDriveFilePickerSuccess', 
     cancel: 'oneDriveFilePickerCancel', 
     error: 'oneDriveFilePickerError' 
    }; 

    OneDrive.open(odOptions); 
} 
launchOneDrivePicker() 

dieses Plunker Siehe:

Note: If openInNewWindow is false, then all callback functions must be declared globally on the page before the SDK is referenced to guarantee the functions will be called. When registered globally the callback function names are renamed with a prefix of oneDriveFilePicker. For example, success becomes oneDriveFilePickerSuccess.

Sie Option wie definieren müssen https://plnkr.co/edit/ZMtF5IAgp7Vycff6mcaD?p=preview

+0

Dies führte zu den aufgerufenen Funktionen, allerdings musste ich die cbs wie folgt aufrufen: 'success()', 'cancel()', 'error()'. Ich konnte auch keine params durch den Aufruf übergeben: 'success (files)' löst den Fehler 'files is undefined' aus.Schließlich rief dies alle drei Funktionen nacheinander auf, gefolgt von dem Fehler. Die Funktion [OneDriveSDK Error] fehlte und war nicht optional, als würde sie alle Callbacks ad infinitum aufrufen. – RoboRob

+0

Sorry, ich verstehe nicht. Sie haben einen anderen Fehler mit meiner Antwort? Wenn Sie success() aufrufen möchten, können Sie Ihre letzte Einstellung auf oneDriveFilePickerSuccess anwenden: oneDriveFilePickerSuccess: Funktion (Dateien) {Erfolg (Dateien)} – Silvinus

+0

Ich mache @Silvinius, ich bekomme Folgendes mit dem Code, den Sie mir oben gegeben haben: 'Uncaught Error: [Die OneDriveSDK Error] -Funktion fehlte und war nicht optional - scheint, als würde er keine anon-Funktionen übernehmen und der Parameter wird nicht mit einer benannten Funktion übergeben. – RoboRob

2

Ihre Funktionen sind anonyme Funktionen, um sie globale Funktionen in diesem Sinne zu machen, müssen Sie:

function oneDriveFilePickerSuccess(files) { 
    console.log('OneDrive Launch Success!'); 
} 

function oneDriveFilePickerError() { 
    console.log('OneDrive Launch Failed!'); 
} 

function oneDriveFilePickerCancel(e) { 
    console.log('OneDrive Launch Cancelled!'); 
} 

function launchOneDrivePicker() { 
    var odOptions = { 
     clientId: <?php echo '"' . esc_attr(get_option('rod_api_key')) . '"'; ?>, 
     action: "query", 
     openInNewWindow: false, 
     success: 'oneDriveFilePickerSuccess', 
     cancel: 'oneDriveFilePickerCancel', 
     error: 'oneDriveFilePickerError' 
    }; 

    OneDrive.open(odOptions); 
} 

Es ist wichtig, ihre Funktionen zu verweisen, indem Namen, anstatt sie in anonyme Funktionen zu verpacken oder Referenzen an sie zu übergeben.

Hoffe, das hilft.

+0

Hallo, ich habe die referenzierte JS in den Kopf und OneDrive.js in die Fußzeile aufgenommen. Ich habe versucht, die Funktionen innerhalb und außerhalb der Anon-Funktionen, aber es machte keinen Unterschied – RoboRob

+0

Ich habe nur die Antwort bearbeitet, um richtig zu sein. –

0

Fügen Sie das Skript OneDrive.js vor oder nach diesem Snippet ein? Ich denke, was sie mit "global deklariert vor der SDK-Referenzierung" meinen, ist, dass Sie zuerst ihre Callback-Funktionen deklarieren und dann ihr SDK-Skript einbinden, damit das SDK diese Funktionen registrieren kann (deshalb ist es wichtig, diese Funktionen richtig zu benennen). Das würde bedeuten, Sie müßten Ihren Code wie

<script> 
    function oneDriveFilePickerSuccess(files) { 
     console.log('OneDrive Launch Success!'); 
    } 

    function oneDriveFilePickerError() { 
     console.log('OneDrive Launch Failed!'); 
    } 

    function oneDriveFilePickerCancel(e) { 
     console.log('OneDrive Launch Cancelled!'); 
    } 
</script> 

<script src="https://js.live.net/v7.0/OneDrive.js"></script> 

<script> 
    function launchOneDrivePicker() { 
     // ... 
    } 
</script> 

In einem Skript die Position einer Funktionsdeklaration aufgeteilt spielt keine Rolle, aber jeder Script-Tag wird auf einem eigenen ausgeführt, so ist es nicht egal, dann.

+0

Nach dem Verschieben der Startfunktion Def unter dem SDK, immer noch den gleichen Fehler. Ich werde das in meinem Beitrag klären. – RoboRob