如何从JavaScript调用Dart函数

17

我们公司有一个很多漏洞的JavaScript客户端应用程序。像大多数JavaScript应用程序一样,代码正在迅速变得难以管理。

我个人认为使用Dart编写会是一个更好的解决方案。但是重新开始的管理方法行不通。

我知道可以从Dart调用JavaScript代码,但是是否可以从JavaScript调用Dart代码?

这将允许我们逐步使用Dart版本替换更关键的库,同时仍然能够使用原始代码库。


这个回答解决了你的问题吗?如何在Dart语言中创建全局(在窗口上)对象? - ggorlen
3个回答

19

你应该尝试使用Dart的JS interop库

你可以在Dart中定义回调函数并将其导出(以某种方式)到JavaScript中。

看看这个例子:

Dart代码定义JS函数

 context['javascriptFunctionName'] = (parameter) {
       //call any Dart method
    }

然后从JavaScript中调用它:

javascriptFunctionName({'param': 'value'});

2
您可以在 https://github.com/hangstrap/TestJavascriptCall 找到一个简单的示例项目。感谢您的帮助! - richard
注意:这个 context[...] 需要添加到 Dart 的 main() 函数中。你还需要一个 import 'dart:js'; - alanjds
嘿,我们能否从JavaScript传递参数到Dart?我能够从JavaScript调用Dart函数,但无法将参数与函数一起传递。 - Ayush Malviya
@AyushMalviya 在我的示例中,你可以定义一个从Dart导出到JavaScript的函数,并且知道如何带参数调用它。我不确定现在它有多准确,因为我已经有一段时间没有使用Dart了,但我认为它仍然是有效的。 - Pawel Uchida-Psztyc

6

使用js包而非dart:js,可以这样将其提供给JS:

import 'dart:html';
import 'package:js/js_util.dart';

void main() {
  setProperty(window, 'callDartFunc', allowInterop(dartFunc));
}

String dartFunc() => 'Hello World';

感谢Matan Lurey的贡献。请访问以下链接:https://gitter.im/dart-lang/TALK-general?at=585b9b42db9cafe9183a3345

-5
只要你在你的html文件中包含了必要的dart行:
<script type="application/dart" src="fileName.dart"></script>
<script src="packages/browser/dart.js"></script>

你应该能够添加Dart替换代码并编译它。这样,你可以逐步开始进行转换。据我所知,没有办法从JavaScript调用Dart代码。


既然我有更多时间了,让我详细解释一下。由于Dart是一种相对较新的语言,并且它并没有增加JavaScript语言的什么功能,因此Oracle没有太多的动力为其添加与Dart的跨兼容性。虽然这两种语言可能不太兼容,但它们可以共存,并且具有更单向的关系。

只要您直接从HTML文件或其他Dart函数中调用Dart代码,您就至少可以开始将Dart集成到您的站点中。随着时间的推移,如果您决定采取这个方向,应该能够开始更新JavaScript到Dart的漫长过程。


谢谢,我想在同一页中运行Dart和Javascript是一个开始,但我需要能够从Javascript代码中调用Dart函数。我们的应用程序比一些挂在几个DOM元素上的JavaScript或Dart函数复杂得多... - richard
8
Oracle与这一切有什么关系? - Günter Zöchbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接