2016-08-18 4 views
3

Я пытаюсь создать реализацию дротика API-интерфейса auth0 с помощью пакета js от https://pub.dartlang.org/packages/js.преобразование объекта javascript, возвращаемого из javascript API, в класс дротика

так я загружаю https://cdn.auth0.com/js/lock/10.0.0/lock.min.js в index.html, и я создал следующий класс auth0lock дротика:

@JS() 
library auth0lock; 

import 'package:js/js.dart'; 

@JS('Auth0Lock') 
class Auth0LockJS { 
    external factory Auth0LockJS(String token, String domain, Object options); 
    external on(String event, Function func); 
    external show(); 
} 

class Auth0Lock { 
    Auth0LockJS auth0; 
    Auth0Lock(String token, String domain, Object options) { 
    this.auth0 = new Auth0LockJS(token,domain,options); 
    } 
    on(String event, Function func) { 
    this.auth0.on(event,allowInterop(func)); 
    } 
    show() { 
    this.auth0.show(); 
    } 
} 

@anonymous 
@JS() 
class AuthResult { 
external factory AuthResult({ 
    String accessToken, 
    String idToken, 
    String idTokenPayload, 
    String state 
}); 
    external String get accessToken; 
    external set accessToken(String v); 
    external String get idToken; 
    external set idToken(String v); 
    external Object get idTokenPayload; 
    external set idTokenPayload(Object v); 
    external String get state; 
    external set state(String v); 
} 

Я пишу приложение angular2-дротик, так что я создал службу аутентификации, которая использует auth0lock.dart файл, который я ранее показывал, используя следующий код:

@Injectable() 
class Auth { 
    Auth0Lock lock; 

    authenticatedEvent(AuthResult authResult) { 
     print(authResult); 
    } 

    Auth() { 
     this.lock = new Auth0Lock(configObj.auth0.apiKey, configObj.auth0.domain,{}); 
     this.lock.on("authenticated", authenticatedEvent); 
    } 
    updateProfileName(data) { 
     var profile = data['profile'] != null ? data['profile'] : data; 
     print(profile['name']); 
    } 

    authenticated() { 
     return false; 
    } 

    login() { 
     this.lock.show(); 
    } 
} 

сейчас ... все на самом деле работает! Я создал в файле auth_service.dart переменную с именем AuthLock по имени lock. Я экземпляр с параметрами, запустите функцию show(), подключитесь к событию authenticated, и функция запущена с завершением аутентификации.

Я создал класс AuthResult, но он игнорирует его, и я получаю объект javascript, возвращенный из обработчика функции.

Я программирую код с помощью Intellij и выполняю действия с dartium. поэтому, когда я помещаю точку останова на строку print(authResult); в файле auth_service.dart, отладчик показывает, что объект authResult содержит 2 свойства, JavaScript View типа Object и class типа JSObjectimpl. Javascript View содержит все свойства, возвращаемые этим обработчиком.

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

спасибо!

обновление

внутри authenticatedEvent функции Я пытался печати authResult.values, который произвел ошибку, что класс типа JSObjectImpl не имеет такой функции. поэтому возвращаемым объектом является тип JSObjectImpl. странно то, что я понятия не имею, где JSObjectImpl определяется так что я удалил переменную типа authResult и попытался использовать переменные внутри каталога с помощью следующего кода:

authenticatedEvent(authResult) { 
    var a = authResult.accessToken; 
    print(a); 
} 

это работает. почему я не могу найти JSObjectImpl типа в дротике? любой быстрый способ преобразовать это в класс дротика?

благодаря

ответ

1

Возможно, вам просто нужно удалить @anonymousAuthResult из

упрощенным, но полный и похожего примеру

index.html

<!doctype html> 
<html> 
    <head> 
    <script> 
     var Apple = function(type) { 
     this.type = type; 
     this.color = "red"; 
     this.getInfo2 = function() { 
      return this.color + ' ' + this.type + ' apple'; 
     }; 
     }; 

     Apple.prototype.getInfo = function() { 
     return this.color + ' ' + this.type + ' apple'; 
     }; 

     function callback(f) { 
     console.log(f); 
     f(new Apple('Golden Delicious')); 
     } 
    </script> 
    </head> 
    <body> 
    <script type="application/dart" src="index.dart"></script> 
    <script src="packages/browser/dart.js"></script> 
    </body> 
</html> 

index.dart

@JS() 
library typed_callback.web; 

import 'package:js/js.dart'; 

@JS() 
class Apple { 
    external String get type; 
    external set type(String type); 
    external String get color; 
    external set color(String color); 
    external String getInfo(); 
    external String getInfo2(); 
    external Apple(String type); 
} 

typedef void Callback(Apple a); 

@JS('callback') 
external void callback(Callback /* or just Function */ f); 

f(Apple apple) { 
    print(apple.getInfo()); 
    print(apple); // prints the stringified JS object [object Object] 
} 

main() async { 
    callback(allowInterop(f)); 
} 
+0

Hi. Спасибо за вашу помощь.к сожалению, удаление @anonymous тега не решает проблему. AuthResult, который я получаю, является объектом json, а не классом. Мне интересно, как преобразовать его в класс дротика. – ufk

+0

В моем примере то, что передано 'Apple', также выглядит как объект JS при печати, но может использоваться как класс Dart. Я не думаю, что есть способ создать настоящий класс Дарт. Все, что вы получаете, - это прокси-сервер, который позволяет вам получать доступ к свойствам и методам, таким как класс Dart. –

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

  • Нет связанных вопросов^_^