2

对不起我的英语不好。我是 Dart 语言的新手。我一直在寻找一种在 JS 和 Dart 之间进行通信的方法。我想从 Dart 调用 jQueryUI 代码。

当我创建一个 jQueryUI 的对话框时,HTML 和 JS 代码将是这样的:

HTML 代码:

...
<button id="btn1">OPEN</button>
<div id="msg">
Hello, world!
</div>
...

JS代码:

$('#btn').click( function() {
  $('#msg').dialog('open');
});

$('#msg').dialog({
  autoOpen: false,
  buttons: {
    "OK": function() {
      $(this).dialog('close');
    }
  },
  title: "Dialog",
  modal: false,
  show: 'fold',
  hide: 'puff'
});

因此,我尝试将这些 JS 代码转换为 Dart 代码。但是,当我在下面编写这些测试 Dart 代码时,我在下面收到一条错误消息。

Breaking on exception: Closure call with mismatched arguments: function 'call'

飞镖代码:

import 'dart:html';
import 'dart:js' as js;

void dartFunc() {
  print("test");
}

void main() {

  js.JsObject btn = js.context.callMethod(r'$', ['#btn']);
  btn.callMethod('click', [dartFunc]); //-----> ERROR!
  //...
}

但是,当我在下面写一个 JS 函数和 Dart 代码时,错误消失了,程序运行成功。

JS代码:

function jsFunc() {
  console.log("test");
}

飞镖代码:

import 'dart:html';
import 'dart:js' as js;

void dartFunc() {
  print("test");
}

void main() {

  js.JsObject btn = js.context.callMethod(r'$', ['#btn']);
  btn.callMethod('click', [jsFunc]); -----> SUCCESS!
  //...
}

为了找出这个问题,我进行了一些测试。当我从 Dart 将两个函数(jsFunc() 和 dartFunc()) 打印到控制台时,例如

飞镖代码:

...
js.context['dartFunc'] = dartFunc;
print(js.context['jsFunc']);
print(js.context['dartFunc']);
...

结果如下。

function jsFunc() {
  console.log("test");
}
function () {
  return func(Array.prototype.slice.apply(arguments));
} 

显然,结果print(js.context['dartFunc'])很奇怪。

任何人都可以帮忙吗?是否可以从 Dart 定义有效的 JavaScript 函数?

感谢您阅读到最后:)

4

1 回答 1

2

js函数允许调用的参数个数与声明数不同。这在 Dart 中是不一样的。

基本上,您定义的回调 ( dartFunc) 至少使用一个参数调用,但该函数不支持参数。您可以简单地将可选参数添加到您的 Dart 函数中。因此错误应该消失。

void dartFunc([arg1,arg2,arg3]) {
  print("test");
}

现在可以使用 0 到 3 个参数调用该函数。

于 2014-02-26T17:40:01.340 回答