2015-12-17 13 views
0

Вопрос о scalajs и javascript.функция экспорта в глобальную область в scalajs

Как отметить функцию, которая будет экспортироваться исключительно в глобальную область?

Данный объект в пакете Scala верхнего уровня

@JSExport 
object Foo{ 
def apply(a: Int, b: Int): String = "bar"+a+b 
} 

Я хотел бы скомпилировать этот код SCALA в Javascript и иметь эту функцию с именем Foo в глобальном масштабе. Другими словами, я хотел бы иметь javascript, аналогичный этому:

function Foo(a,b) { 
    return 'bar'+a+b; 
} 

Возможно ли использование скайайсов?

Я пишу компонент в javascript, на который будут ссылаться сторонние API, на которые не может повлиять я. Вот почему мне просто нужно следовать их правилам и предоставлять функции javascript в глобальной области.

+0

Хм - необычная просьба. Как работает API? Ожидается, что вы передадите * имя * функции, определенной в глобальной области, или что-то в этом роде? –

+0

API требует определения скрипта с функциями в глобальной области действия с определенными именами, например, '' 'function anything() {...}' '', который будет вызываться всякий раз, когда происходит какое-либо событие. Подробнее см. Https://docs.cycling74.com/max7/vignettes/jsbasic. –

+0

Собственно, это дубликат: http://stackoverflow.com/questions/27440235/using-scala-js-method-as-callback – gzm0

ответ

1

Решение этой проблемы теперь представлено в разделе «Верхний уровень экспорта», как описано в закрытом выпуске #1381 - для использования этой функции помечайте функцию в объекте с помощью @JSExportTopLevel.

object A { 
    @JSExportTopLevel("foo") 
    def foo(x: Int): Int = x + 1 
} 

<Foo will be available from JavaScript's global namespace>

(См https://www.scala-js.org/doc/interoperability/export-to-javascript.html для официальной документации, в разделе "Экспорт методов верхнего уровня").

1

В настоящее время вы не можете сделать это, не выполняя какой-либо код. Но вы можете иметь код установки, который присваивает ему:

import scala.scalajs.js 

object App extends js.JSApp { 
    def main(): Unit = { 
    js.Dynamic.global.anything = // your js.FunctionN 

    } 
} 

Там есть вопрос открыт (#1381), чтобы иметь языковую поддержку для этого.

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