2016-06-24 7 views
2

Я пытаюсь реализовать v7 OneDrive SDK нашел here, но когда я использую синтаксис для функций обработчиков событий, найденных в примере массиве на этой странице, я получаю эту ошибку:MS OneDrive JavaScript SDK Handlers Not Global?

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

Это мой код :

<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> 

(Примечание:. все это происходит в контексте страницы WordPress и быть выплюнул в голове, в то время как SDK будет помещён в сноске)

Я попытался просто называя названный functi дополнения, например:

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

Это работает только без прохождения Params (например, od_success()), но в этом случае, он вызывает все три в последовательности, а затем выдает ошибку выше. Если я добавлю параметры для вызова, как указано выше, он сообщает мне, что files не определено.

Заранее спасибо за помощь

+0

вы могли бы обеспечить точное сообщение об ошибке? –

+0

Спасибо, Саймон, я обновил сообщение – RoboRob

ответ

1

Смотрите в документации:

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.

Вы должны определить вариант, как:

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() 

Смотрите эту plunker: https://plnkr.co/edit/ZMtF5IAgp7Vycff6mcaD?p=preview

+0

Это привело к вызовам функций, однако мне нужно было вызвать cbs так: 'success()', 'cancel()', 'error()'. Я также не мог передать какие-либо параметры через вызов: 'success (files)' выдает ошибку 'files is undefined'.Наконец, это вызвало все три функции подряд, за которыми последовала ошибка, «Функция [OneDriveSDK Error] отсутствовала, а не факультативно», как будто она просто вызывала все обратные вызовы ad infinitum. – RoboRob

+0

Извините, я не понимаю. У вас есть еще одна ошибка с моим ответом? Если вы хотите вызвать success(), вы можете применить на oneDriveFilePickerSuccess свой последний параметр: oneDriveFilePickerSuccess: function (files) {success (files)} – Silvinus

+0

Я делаю @Silvinius, я получил следующее с кодом, который вы мне указали выше: 'Uncaught Error: функция [OneDriveSDK Error] отсутствовала, а не факультативно' - кажется, что она не будет принимать анонные функции, а параметр не передается с именованной функцией. – RoboRob

2

ваши функции анонимные функции для того, чтобы сделать их глобальные функции в этом смысле вы должны:

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); 
} 

Важно ссылаться на функции их вместо того, чтобы обертывать их анонимными функциями или передавать ссылки на них.

Надеюсь, это поможет.

+0

Привет, я включил упоминаемый JS в голову и OneDrive.js в нижнем колонтитуле. Я пробовал функции внутри и вне функций анона, но это не помогло. – RoboRob

+0

Я только что отредактировал ответ, чтобы быть прав. –

0

Включите ли вы сценарий OneDrive.js до или после этого фрагмента? Я думаю, что они означают «объявлено глобально, прежде чем ссылаться на SDK», это то, что вы сначала объявляете свои функции обратного вызова, а затем включаете их сценарий SDK, поэтому SDK может регистрировать эти функции (поэтому важно правильно назвать эти функции). Это означало бы, вы должны разделить ваш код

<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> 

В одном скрипте положение в объявлении функции не имеет значения, но каждый тег скрипта выполняется самостоятельно, так что это действительно имеет значение то.

+0

После перемещения функции запуска ниже SDK, все еще получая ту же ошибку. Я собираюсь уточнить в своем посте. – RoboRob

Смежные вопросы