2015-01-21 3 views
4

Я пытаюсь выполнить вызовы jquery-ui из scala.js. Я попытался изменить способ реализации библиотеки jquery, но без успеха. Таким образом, я определил следующую черту и упаковку объект:Выполнение jquery-ui в scala.js

trait JQueryUI extends js.Object { 

    def apply(selector: String): JQueryUI = ??? 
    val buttonset: js.Any = ??? 
} 

package object jqueryui extends js.GlobalScope { 
    val jQueryUI: JQueryUI = ??? 
} 

А потом добавил JSApp следующим образом:

object JQueryUIApp extends JSApp { 
    def main(): Unit = { 
     jqueryui.jQueryUI("#sports").buttonset 
    } 
} 

Но на моей консоли JavaScript я получаю следующее сообщение об ошибке:

TypeError: ScalaJS.g["jQueryUI"] is not a function (0, ScalaJS.g["jQueryUI"])("#sports")["buttonset"]

Может ли кто-нибудь сказать мне, что мне не хватает?

ответ

5

Объявив val jQueryUI как в вашем объекте пакета, вы скажете Scala.js, что это соответствует глобальной переменной в JavaScript с именем jQueryUI. Теперь это неверно: фактическая переменная, которую вы ищете, называется jQuery. Вы можете исправить это, называя явно значение с @JSName:

import scala.scalajs.js.annotation.JSName 

package object jqueryui extends js.GlobalScope { 
    @JSName("jQuery") 
    val jQueryUI: JQueryUI = ??? 
} 

Однако, так как JQuery-UI является буквально расширением из jQuery объекта, я бы определил это с методами расширения на JQuery черте scalajs-jquery. Это позволит использовать обычный jQuery для обоих способов использования (методы jQuery-core и методы jQuery-UI). Общий механизм объясняется в the Calling JavaScript guide под названием «Патч обезьяны». В вашем случае, это будет выглядеть следующим образом:

trait JQueryUI extends JQuery { 
    val buttonset: js.Any = ??? 
} 

object JQueryUI { 
    implicit def jQueryUIExtensions(query: JQuery): JQueryUI = 
    query.asInstanceOf[JQueryUI] 
} 

Используя эти определения, вы можете сделать:

import org.scalajs.jquery._ 
import JQueryUI.jQueryUIExtensions 

def main(): Unit = { 
    jQuery("#sports").buttonset 
} 

Обратите внимание, что я использую нормальный jquery.jQuery объект, который возвращает нормальный JQuery объект, но затем я вызываю значение buttonset, которое определено в JQueryUI. Это работает из-за неявного преобразования jQueryUIExtensions.

+1

Работал отлично. Просто нужно было изменить «val buttonset» на «def buttonset()» – user79074

+0

Можно ли добавить функцию к признаку JQueryStatic. Например, чтобы получить результат, подобный jQuery.someFunction()? –

+1

@AlexKarasev Да. Используйте точно такую ​​же технику, но замените 'JQuery' на' JQueryStatic' в 'implicit def'. Эта технология работает для любого типа JavaScript. – sjrd

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