我正在尝试在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
函数。
答案 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
。