как обрабатывать вложенные объекты из js в dart (новый dart-js-interop)

Я создал надстройку для Outlook Office365 и использовал их office.js, чтобы получать информацию из электронной почты.

пример dart.js:

js.context['Office']['context']['mailbox']['userProfile']['emailAddress']

or

js.context['Office']['context']['mailbox']['item']['to'].callMethod('getAsync', [callback(result)])

Как я могу использовать новый dart-js-interop для таких нужд?


person Danil Selivanov    schedule 28.03.2016    source источник


Ответы (1)


@JS('Office.context.mailbox.userProfile.emailAddress')
external get emailAddress;
@JS('Office.context.mailbox.item.to.getAsync')
external getAsync(Function callback);

когда вы вызываете getAsync, вам нужно обернуть функцию, которую вы передаете обратному вызову, с помощью allowInterop или allowInteropCaptureThis

getAsync(allowInterop((x) => print(x)));

Попробуйте с осторожностью. Я немного поиграл с новым dart-js-interop несколько месяцев назад, но сам еще не использовал его в реальном коде.

person Günter Zöchbauer    schedule 28.03.2016
comment
Большое спасибо! Это помогает мне для статических вызовов. Да, это на самом деле mailbox :) - person Danil Selivanov; 28.03.2016
comment
Кстати, как быть с JSObjectImpl? у него нет таких методов, как callMethod() или ['fieldName']. - person Danil Selivanov; 28.03.2016
comment
Не уверен, я думаю, вам нужно привести его к конкретному типу. Откуда вы это взяли? - person Günter Zöchbauer; 28.03.2016
comment
Я пытался выполнить кастинг, но это всегда экземпляр JSObjectImpl. Это происходит от js_dartium.dart: ' класс JSObjectImpl расширяет JSObject $implementsClause { JSObjectImpl.internal() : super.internal(); }' - person Danil Selivanov; 28.03.2016
comment
Я имел в виду - откуда у вас ссылка. Какая функция/геттер... возвращает его? - person Günter Zöchbauer; 28.03.2016
comment
@JS('Office.context.mailbox.item.to') external get to; и рабочий код: main { print(to[0]); } to геттер возвращает JSArrayImpl - person Danil Selivanov; 28.03.2016
comment
Я думаю, вам нужно создать класс сопоставления и использовать его для ввода обратного вызова с помощью typedef. Я могу еще раз посмотреть завтра. Время спать. - person Günter Zöchbauer; 28.03.2016
comment
JSArrayImpl реализует List, поэтому вы можете индексировать его таким образом. и у него не будет имен полей, это массив. Для JSObjectImpl это указывает на то, что вы не обернули, и вам нужно это обернуть, или у него есть оператор нижнего индекса, который вы должны иметь возможность использовать. - person Alan Knight; 30.03.2016