4

我经常遇到这种情况, 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

4

1 回答 1

4

它适用于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 问题。

于 2015-06-21T21:19:29.587 回答