2014-12-31 11 views
2

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

EDIT:

Я также попытался:

Создайте функцию, чтобы для использования 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 таким образом.

+0

Что означает 'context ['lunr']' return? Доступен ли lunr в консоли js? – Ozan

+0

'context ['lunr']' возвращает значение null. Он недоступен в консоли js. Lunr.js помещается в мой каталог web/lib/вместе с файлом 'LunrSearch.dart'. – kennyjwilli

+0

вам нужно включить скрипт в html, например '' – Ozan

ответ

0

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

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

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

Получил его. Прямо сейчас все, что я получаю каждый раз, когда я пытаюсь создать объект, я получаю: «Исключение: конструктор не функция». – kennyjwilli

+0

Какая строка кода выполняется, когда вы получаете это исключение? –

+0

Я считаю, что мы выяснили, как использовать 'this', см. Мое редактирование в исходном вопросе выше. Тем не менее, я все еще получаю сообщение об ошибке. – kennyjwilli

0

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

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

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

+0

Спасибо за ввод! Однако я считаю, что я должен переименовать заголовок в другое, я думаю (не уверен), что мы выяснили, как использовать 'this' в функции. Единственное, что это не правильный синтаксис для создания объекта с функцией. – kennyjwilli

2

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

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

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

Смежные вопросы