2

我正在尝试在 Dart 中为 lunr.js ( http://lunrjs.com/ ) 创建一个包装器,但是,我找不到有关如何使用thisDart js 互操作的文档。

这是我要创建的对象:

var index = lunr(function () {
    this.field('title', {boost: 10})
    this.field('body')
    this.ref('id')
  })

目前这就是我所拥有的。

JsObject index = new JsObject(context['lunr'], [()
    {

    }]);

我如何能够this从匿名函数访问?

另外,我将实际的 lunr.js 放在哪里?我只是为它制作一个包装器,因此除非必要,否则我看不出有任何理由将它放在 HTML 文件中。

编辑:

我也试过:

创建一个函数以允许使用this关键字。(仍然不确定这种语法是否正确)

_f = new JsFunction.withThis( (t) {
    t.callMethod('field', ['title', {boost: 10}])
    t.callMethod('field', ['body'])
    t.callMethod('ref', ['id'])
  });

JsObject然后使用该函数创建一个:

JsObject index = new JsObject(context['lunr'], [_f]);

这会给我这个错误:

异常:未处理的异常:带有不匹配参数的闭包调用:函数“调用”

NoSuchMethodError: incorrect number of arguments passed to method named 'call'
Receiver: Closure: (dynamic) => dynamic
Tried calling: call(Instance of 'JsObject', Instance of 'JsObject')
Found: call(t)
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:45)

接下来我尝试了这个:

JsObject index =new JsObject.fromBrowserObject(context['lunr']);

这给了我一个不同的错误:Exception: Illegal argument(s): object cannot be a num, string, bool, or null

这可能是因为我没有办法在以_f这种方式创建 JsObject 时调用该函数。

4

3 回答 3

2

你必须使用:

context.callMethod('lunr', [_f]);

new JsObject(context['lunr'], [_f]);与 JS中的相同new lunr(f)

于 2015-01-14T11:10:27.307 回答
0

我认为如果你只是在函数中使用它,它将被函数封闭。否则,您可以尝试使用模拟函数,在this实例化模拟函数的实例时传递 。

class SomeFunction implements Function {
    ThisType thisVal;
    SomeFunction(this.thisVal);

    call(args) {
      thisVal.field(...);
    }
}
于 2014-12-31T23:32:59.420 回答
0

我根本不知道飞镖,但也许你可以回避尝试this完全使用的问题。您传递给函数的lunr函数具有作为第一个参数产生的创建索引以及函数的上下文。

var index = lunr(function (idx) {
  idx.field('title', { boost: 10 })
  idx.field('body')
  idx.ref('id')
})

上面使用了产生的索引对象,而不是依赖于被设置为索引的上下文,所以你不需要使用this.

于 2015-01-02T18:45:32.730 回答