2015-02-22 1 views
4

Я пишу библиотеку Дарта, которая вызывается из JavaScript и по завершении, Дарту нужно вызвать анонимную функцию обратного вызова, которая находится внутри JavaScript.Вызов анонимной функции Javascript из кода Дарта

JavaScript:

function main() { 
    application.log("ready"); 
} 

function getValueById(id){ 
    return document.getElementById(id).value; 
} 

function contact(){ 
    application.log("Contact Submit Clicked"); 
    application.contact({ 
     name: getValueById("contactFormName"), 
     email: getValueById("contactFormEmail"), 
     phone: getValueById("contactFormPhone"), 
     message: getValueById("contactFormMessage"), 
     subject: "Message From " + getValueById("contactFormName") + " via Contact Form", 
     callback: function(response){ 
      // TODO: handle response here 
      console.log("callback being executed"); 
      console.log(response); 
     } 
    }); 
} 

var application = function() { 
    this.companyId = "5905063580"; 
    this.companyName = "Company XYZ"; 
    this.ready = main; 
} 

HTML:

.... 
<button onclick="contact()">Submit</button> 

Dart:

import 'dart:html'; 
import 'dart:js'; 
... 

contact(ContactRequest request, callback) { 
    new RPC.submit(request, URL.contactURL, request.companyName, (res) { 
    ContactResponse response = new ContactResponse(); 
    response.fromJson(res); 

    print(response.toString());   
    // prints {"message":"Message Sent", ...} 

    // do callback here 
    // context.callMethod(callback, [response]); <-- failing here 
    // callback(response); <-- also failing 


    }); 
} 

void main() { 

    String companyId = null; 
    String companyName = null; 

    context['application']['log'] = (String param) { 
    print(param); 
    }; 

    context['application']['contact'] = (JsObject param) { 
    ContactRequest request = new ContactRequest(); 
    request.companyId = companyId; 
    request.companyName = companyName; 
    request.action = "CONTACT"; 
    request.name = param["name"]; 
    request.email = param["email"]; 
    request.phone = param["phone"]; 
    request.message = param["message"]; 
    request.subject = param["subject"]; 
    contact(request, param["callback"]); 
    }; 

    ... 

    var application = new JsObject(context['application']); 
    companyId = application['companyId']; 
    companyName = application["companyName"]; 
    application.callMethod("ready"); 
} 

JavaScript успешно вызова метода контакта Dart Дарт успешно обменивается данными с Java Backend, который отвечает с Json, теперь последний шаг для Dart, чтобы вызвать обратный вызов, который был отправлен t О, это то, где он терпит неудачу и где я не могу понять, как заставить его работать.

если я обратного вызова (ответ), это исключение я получаю:

Exception: Uncaught Error: Class 'JsFunction' has no instance method 'call'. 

NoSuchMethodError: method not found: 'call' 
Receiver: Instance of 'JsFunction' 
Arguments: [Instance of 'ContactResponse'] 
Stack Trace: 
#0  Object.noSuchMethod (dart:core-patch/object_patch.dart:45) 
#1  contact.<anonymous closure> (http://localhost:63342/jsapi/web/cloudauctioneers.v1.dart:24:13) 
#2  RPC.RPC.submit.<anonymous closure> (package:jsapi/model/rpc.dart:10:17) 
#3  _RootZone.runUnary (dart:async/zone.dart:1155) 
#4  _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:484) 
#5  _Future._propagateToListeners (dart:async/future_impl.dart:567) 
#6  _Future._completeWithValue (dart:async/future_impl.dart:358) 
#7  _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:412) 
#8  _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41) 
#9  _asyncRunCallback (dart:async/schedule_microtask.dart:48) 
#10  _handleMutation (dart:html:41819) 
undefined:1undefined 

Это также не: JsFunction.callMethod(callback, [response]);

Exception: Uncaught Error: No static method 'callMethod' declared in class 'JsFunction'. 

NoSuchMethodError: method not found: 'callMethod' 
Receiver: Type: class 'JsFunction' 
Arguments: [Instance of 'JsFunction', Instance(length:1) of '_GrowableList'] 
Stack Trace: 
#0  NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:173) 
#1  contact.<anonymous closure> (http://localhost:63342/jsapi/web/cloudauctioneers.v1.dart:26:16) 
#2  RPC.RPC.submit.<anonymous closure> (package:jsapi/model/rpc.dart:10:17) 
#3  _RootZone.runUnary (dart:async/zone.dart:1155) 
#4  _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:484) 
#5  _Future._propagateToListeners (dart:async/future_impl.dart:567) 
#6  _Future._completeWithValue (dart:async/future_impl.dart:358) 
#7  _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:412) 
#8  _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41) 
#9  _asyncRunCallback (dart:async/schedule_microtask.dart:48) 
#10  _handleMutation (dart:html:41819) 

ответ

3

Я думаю, вам нужно вызвать функцию JavaScript, как

callback.apply([response]); 

Вы не сможете пройти Response таким образом. Вы можете передавать только примитивные значения или коллекцию примитивных значений, такие как:

Map arg = {'message': response.message, 'otherfield': response.otherField}; 
callback.apply([new JsObject.jsify(arg)]); 
+0

Это успешно выполняет обратный вызов, только проблема заключается в ответ, когда распечатываются является «DartObject {}» и response.message явно не определена - как Я конвертирую этот объект DartObject в объект JavaScript? –

+1

Вам нужно создать карту. Я обновляю свой ответ. –

+0

В этом случае это так же просто, как callback.apply ([new JsObject.jsify (response.toJson())]); который преобразует его в карту. response.toJson использует dart: конвертировать для сериализации в Json. Работы 100%, спасибо Гюнтеру !! –