javascript - JsFunction.apply 不起作用,而 JsObject.callMethod 起作用( Dart )

标签 javascript dart dart-js-interop

我经常遇到这种情况,即 JsFunction.apply 无法像我预期的那样工作。考虑这个例子:

import "dart:js";
import "dart:html";

void main() {
  var div = querySelector('div');
  var span = new SpanElement()..text = "hello world";
  var js = new JsObject.fromBrowserObject(div);
  js["appendChild"].apply([span]);

  // this one does work:
  // js.callMethod("appendChild", [span]);
}

我希望 js["appendChild"].apply([span]); 的工作方式与 js.callMethod("appendChild", [span]); 完全相同

另请参阅此演示:https://dartpad.dartlang.org/0f35d76a3c61ba1371f1

最佳答案

它适用于 js["appendChild"].apply([span], thisArg: js);

如果你不提供 thisArg 就像你调用 Function.prototype.applynull 作为第一个参数。

因此您的 Dart 调用与 js 相同:

var div = document.querySelector('div');
var span = document.createElement("span");
span.innerText = "hello world";
div["appendChild"].apply(null, [span]);

上述js代码的执行导致TypeError: Illegal invocation。要使其正常工作,您必须使用 div["appendChild"].apply(div, [span]);

所以这不是 Dart 问题而是 js 问题。

关于javascript - JsFunction.apply 不起作用,而 JsObject.callMethod 起作用( Dart ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30969281/

相关文章:

dart - 将JS对象转换为Dart类

javascript - Bootstrap 游览模板未在所有按钮上应用 id

javascript - 单元测试没有失败

javascript - 具有相同 Controller 的 ng-route

Flutter:让 Text in Text 小部件在新行溢出

flutter - 如何在 flutter 中创建带有透明孔的小部件

dart - 将小部件放在列中会使 RenderIndexedStack 对象在布局期间被赋予无限大小

javascript - 使用 IMG map 显示更大的图像

dart - 使用 Dart JS 与 ES6 类互操作