我有点像飞镖,并试图通过在其中编写一些库函数来弄湿我的脚.
虽然我从dart调用javascript函数没有问题,但我希望能够从javascript调用dart函数,但到目前为止,我没有太多喜欢.
例如,我希望能够从dart中公开一些基本功能,例如:
main() {
String foo() {
return "bar!";
}
js.scoped(() {
js.context.foo = foo;
});
}
Run Code Online (Sandbox Code Playgroud)
然后能够从javascript中调用它们,如下所示:
<script>
window.onload = function() {
alert("foo() = " + foo());
}
</script>
Run Code Online (Sandbox Code Playgroud)
这样的事情甚至可能吗?
在Dart文档中的任何地方,建议使用js
包进行javascript互操作.
但是,我最近发现dart:js
SDK中存在的包似乎具有相似(但不相同)的接口.
这些包装之间有什么区别吗?它们具有相同的功能吗 推荐哪一个?
这是jQuery中的典型情况:
$(".myClass").myFunction({
aKey: 'some value'
});
Run Code Online (Sandbox Code Playgroud)
你怎么称呼dart:js?
index.html(头)
<script>
var callDartMethod = function(dartObject) {
return dartObject.fullName();
}
</script>
Run Code Online (Sandbox Code Playgroud)
index.dart
import 'package:js/js.dart';
@Js() // about to being changed to @JS
external String callDartMethod(p);
main() {
final p = Person.create(firstName: 'Günter', lastName: 'Zöchbauer');
print(callDartMethod(p)); // indirect call from JS
// print(p.fullName()); // call from Dart directly
}
@Js() // about to being changed to @JS
class Person {
external String get firstName;
external set firstName(String firstName);
external String get lastName;
external set lastName(String lastName);
external Function get fullName;
external …
Run Code Online (Sandbox Code Playgroud) 我需要this
从Dart函数访问JavaScript对象.我正在通过Dart-JS interop向JavaScript对象添加一个新方法.我需要从Dart中定义的方法访问JavaScript对象上的属性.
如果我想使用Dart创建一个js库,我如何导出Dart类和函数以便在javascript中使用?
是否有像scala.js类似的内容?
@JSExport
class Hello{
num x = 0
Hello(this.x)
}
Run Code Online (Sandbox Code Playgroud)
因此,在javascript中,用户可以将其实例化为var hi = new Hello(1)
假设我想创建一个名为的全局对象Hello
并world
在该对象上添加函数,以便浏览器中的任何其他 JavaScript 库都可以简单地调用它window.Hello.world();
如何在 Dart lang 中创建这样的对象,以及如何将其公开/全局放置/放在window
对象上?
在纯 JavaScript 中,我将能够编写:
window.Hello = {
world: function() {
console.log("Hello World!");
}
}
window.Hello.world();
Run Code Online (Sandbox Code Playgroud)
但是你如何在 Dart 中做到这一点?
有没有办法call()
从Dart 调用一个名为(在嵌套对象中)的JavaScript函数,还是必须等待call()
可能会删除特殊处理的Dart 2.0 ?
我有一个JS代理:
@JS()
class SomethingFancy {
external String call();
}
Run Code Online (Sandbox Code Playgroud)
但是,由于call()
可以将对象转换为函数,因此无法访问JS对象的函数.
如果可以,我会在Dart中更改方法的名称,但不支持package:js
:
/// By default the dart name is used. It is not valid to specify a custom
/// [name] for class instance members.
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Uncaught Error: NoSuchMethodError: method not found: 'call$0' (J.getSomethingFancy$1$x(...).call$0 is not a function)
如果该函数不存在,则错误如下所示:
Uncaught Error: NoSuchMethodError: method not found: 'callMe' (receiver.callMe is not a function)
同一个对象上的其他函数工作得很好.
我正在尝试等待自定义的全局 JavaScript 函数:
var promise = js.context.callMethod('performAuthenticationInNewWindow', [uri.toString()]);
print(promise);
var qs = await promiseToFuture(promise);
Run Code Online (Sandbox Code Playgroud)
打印以下内容:
[object Promise]
NoSuchMethodError: tried to call a non-function, such as null: 'jsPromise.then'
Run Code Online (Sandbox Code Playgroud) 我使用Dart制作一些应用程序,我有一个简单的问题.我没有在dart:html库中找到提示对话框.我发现只有警报和确认对话电话,但那不是我需要的.我尝试过Dart api的其他一些可能性,但没办法做到这一点.我认为应该有类似于模态对话框或Dart自己的提示对话框.我知道,modal在这里,但它只在弹出窗口中加载另一个文件.
有人能帮助我吗?
更新:实际上,我找到了一个解决方案.它是dart:js库中的JavaScript仿真:
var password=context.callMethod('prompt',['Password','']);
Run Code Online (Sandbox Code Playgroud)
这是一个很好的解决方案,但我认为,必须有比模拟JavaScript更好的东西.
更新2:因为在飞镖规范的提示对话框中的不足,飞镖API和飞镖图书馆这里是谷歌代码问题跟踪的错误,让我们出演的bug,如果你认为提示是spec重要,或者如果你对此有何评论有任何其他的想法,如何以现代的方式做(你可以尝试提出像内置的模态对话框的例子).或者只是分享它,如果您认为提示/模态对话框实现也应该在现代编程语言中...
更新3:现在我们正在讨论新的模态警报,确认和提示对话框,这些对话框可以在Polymer.dart库中.这是谷歌代码问题跟踪器的增强,让我们出演的bug,如果你是该对话框的现代模式的形式,或讨论,如果你知道如何做的更好?