如何从函数创建对象

时间:2014-12-31 21:34:33

标签: dart dart-js-interop

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

这是我想要创建的对象:

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]);

这会给我这个错误:

异常:未处理的异常: 关闭调用不匹配的参数:function' call'

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

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

3 个答案:

答案 0 :(得分:2)

你必须使用:

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

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

答案 1 :(得分:0)

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

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

    call(args) {
      thisVal.field(...);
    }
}

答案 2 :(得分:0)

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

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

以上使用了屈服索引对象,而不是依赖于被设置为索引的上下文,因此您不需要使用this