调用javascript函数,该函数作为javascript库中的参数传递

时间:2016-08-16 15:00:08

标签: dart dart-js-interop

我目前正在尝试将fullcalendar javascript库实现为有角度的2 dart webapp。 我在移植这个javascript代码时遇到了问题但是:

$('#fullCalendar').fullCalendar(
{
    events: function(start, end, timezone, callback) {
        var generated_events=[
        {
            title  : 'test',
            start  : '2016-08-08'
        }];
        callback(generated_events);
    },
    allDaySlot: false
    //More options can go here
});

我已经能够使用此代码将dart函数传递给events参数:

context.callMethod(r'$',['#fullCalendar'])
        .callMethod('fullCalendar',[new JsObject.jsify({
        'events': (start, end, timezone, callback){
            print("called!");
            List<FullCalendarEvent> generated_events= [
                new FullCalendarEvent(title: "test", start: "2016-08-08")
            ];
            try{
                callback(generated_events);
            }catch(exception,stackTrace){
                print("Caught exception!");
                print(exception);
                print(stackTrace);
            }
        },
        'allDaySlot': false
        //more options can go here
    })]);

FullCalendarEvent是一个简单的无趣类结构:

@JS()
@anonymous
class FullCalendarEvent{
    external String get title;
    external set title(String v);

    external String get start;
    external set start(String v);

    external factory FullCalendarEvent({
        String title,
        String start
    });
}

但是callback(generated_events);会抛出此异常:

NoSuchMethodError: method not found: 'call$1' (callback.call$1 is not a function)

修改

在Günter的回复帮助下,我设法解决了这个问题。而不是callback(generated_events);而是使用callback.apply([generated_events]);而不是使用

List<FullCalendarEvent> generated_events= [
    new FullCalendarEvent(title: "test", start: "2016-08-08")
];

我改为使用:

var generated_events = new JsObject.jsify([{'title':'test','start':'2016-08-08'}]);

我的工作代码如下:

context.callMethod(r'$',['#fullCalendar'])
    .callMethod('fullCalendar',[new JsObject.jsify({
        'events': (start, end, timezone, callback){
            print("called!");
            var generated_events = new JsObject.jsify([{'title':'test','start':'2016-08-08'}]);
            try{
                callback.apply([generated_events]);
            }catch(exception,stackTrace){
                print("Caught exception!");
                print(exception);
                print(stackTrace);
            }
        },
        'allDaySlot': false
        //more options can go here
    })]);

1 个答案:

答案 0 :(得分:0)

JS函数应该可以用

调用
callback.apply([gen‌​erated_events])