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

Я пытаюсь создать оболочку для lunr.js (http://lunrjs.com/) в Dart, однако, Я не могу найти документации о том, как использовать this с JS-взаимодействием Dart.

Это объект, который я пытаюсь создать:

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 таким образом.


person kennyjwilli    schedule 31.12.2014    source источник
comment
Что возвращает context['lunr']? Доступен ли lunr в консоли js?   -  person Ozan    schedule 01.01.2015
comment
context['lunr'] возвращает ноль. Это недоступно в консоли js. Lunr.js находится в моем каталоге web / lib / вместе с моим файлом LunrSearch.dart.   -  person kennyjwilli    schedule 01.01.2015
comment
вам нужно включить скрипт в html, например <script src="web/lib/lunr.js"></script>   -  person Ozan    schedule 01.01.2015
comment
Хорошо. Теперь я получаю следующую ошибку: pastebin.com/VPEe4qB3. Это от выполнения JsObject index = new JsObject(context['lunr'], [_f]);   -  person kennyjwilli    schedule 01.01.2015


Ответы (3)


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

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

new JsObject(context['lunr'], [_f]); - это то же самое, что new lunr(f) в JS.

person Alexandre Ardhuin    schedule 14.01.2015

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

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

    call(args) {
      thisVal.field(...);
    }
}
person Günter Zöchbauer    schedule 31.12.2014
comment
Понятно. Прямо сейчас все, что я получаю каждый раз, когда пытаюсь создать объект, который получаю: Exception: constructor not a function. - person kennyjwilli; 01.01.2015
comment
Какая строка кода выполняется, когда вы получаете это исключение? - person Günter Zöchbauer; 02.01.2015
comment
Я считаю, что мы выяснили, как использовать this см. Мою правку в исходном вопросе выше. Однако я все еще получаю сообщение об ошибке .. - person kennyjwilli; 02.01.2015

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

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

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

person Oliver Nightingale    schedule 02.01.2015
comment
Спасибо за вклад! Однако я считаю, что мне следует переименовать заголовок во что-то другое, я думаю (не уверен), что мы выяснили, как использовать this в функции. Единственное, что это неправильный синтаксис для создания объекта с функцией. - person kennyjwilli; 02.01.2015