Как создать объект из функции

Я пытаюсь создать обертку для lunr.js(http://lunrjs.com/) в Dart, однако я не могу найти документацию о том, как использовать this при взаимодействии Dart 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]);

Это даст мне эту ошибку:

Исключение: Необработанное исключение: Закрытие вызова с несогласованными аргументами: 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

Это может быть связано с тем, что у меня нет способа вызвать функцию _f при создании JsObject таким образом.

3 ответа

Вы должны использовать:

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

new JsObject(context['lunr'], [_f]); совпадает с new lunr(f) в JS.


Я вообще не знаю дротиков, но, возможно, вы можете обойти проблему, пытаясь использовать this полностью. Функция, которую вы передаете функции lunr имеет созданный индекс, полученный как первый параметр, а также контекст функции.

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

Вышеизложенное использует объект с заданным индексом вместо того, чтобы полагаться на контекст, задаваемый как индекс, поэтому вам не нужно использовать this.


Я думаю, что если вы просто используете его в функции, он будет закрыт функцией. В противном случае вы можете попробовать использовать эмулированную функцию, в которой вы передаете this когда вы создаете экземпляр эмулируемой функции.

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

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

licensed under cc by-sa 3.0 with attribution.