2017-01-27 4 views
0

Я собираюсь использовать диод для управления состоянием приложения с однонаправленным потоком данных. Я использую Playframework 2,4 и Scala.js и здесь является частью build.sbt для клиента подпроекта:Компонент Rendering React (scalajs-react) с ошибкой диода

libraryDependencies ++= Seq(
    ... 
    "me.chrons" %%% "diode" % "1.0.0", 
    "me.chrons" %%% "diode-react" % "1.0.0", 
    "com.github.japgolly.scalajs-react" %%% "core" % "0.11.3", 
    "com.github.japgolly.scalajs-react" %%% "extra" % "0.11.3" 
), 

Я могу запустить основные образцы из scalajs-среагировать и решил расширить Timer sample с поддержкой Diode. Я написал Curcuit объект:

object TimerCircuit extends Circuit[TimerRootModel] with ReactConnector[TimerRootModel] { 
    // initialModel and actionHanler implemented here 
} 

учебники и образцы не показывают нам, как сделать Реагировать компоненты с помощью ReactDOM.render(...), но только с использованием пакета japgolly.scalajs.react.extra.router.

Однако, я не хочу использовать маршрутизатор на этот раз и хочу только, чтобы сделать свой компонент в HTML корневого тега, например так:

class ReactStateSampleView() { 

    case class State(secondsElapsed: Long) 

    class Backend($: BackendScope[ModelProxy[String], State]) { 
    val DefaultInterval: Long = 1000 

    //noinspection ScalaStyle 
    var interval: js.UndefOr[js.timers.SetIntervalHandle] = js.undefined 

    def tick: Callback = $.modState(s => State(s.secondsElapsed + 1)) 

    def start: Callback = Callback { 
     interval = js.timers.setInterval(DefaultInterval)(tick.runNow()) 
    } 

    def clear: Callback = Callback { 
     interval foreach js.timers.clearInterval 
     interval = js.undefined 
    } 

    def render(s: State): ReactTag = 
     <.div("Seconds elapsed: ", s.secondsElapsed) 
    } 

    val timer = ReactComponentB[ModelProxy[String]]("Timer") 
    .initialState(State(0)) 
    .renderBackend[Backend] 
    .componentDidMount(_.backend.start) 
    .componentWillMount(_.backend.clear) 
    .build 

    val sc = TimerCircuit.connect(_.data) 

    ReactDOM.render(sc(p => timer(p)), dom.document.getElementById("timer")) 

, но эта часть

ReactDOM.render(sc(p => timer(p)), dom.document.getElementById("timer")) 

Безразлично» т работы. Проект не компилируется и не отображается "RuntimeException: There were linking errors"

Как решить эту проблему?

Update

Вот точное сообщение о соединительных ошибках и трассировке стеки:

[info] Fast optimizing C:\tmp\project\client\target\scala-2.11\client-fastopt.js 
[error] Referring to non-existent class japgolly.scalajs.react.Callback$ResultGuard$ 
[error] called from diode.react.ReactConnector$$anonfun$wrap$1.apply(java.lang.Object)scala.Function0 
[error] called from diode.react.ReactConnector$$anonfun$wrap$1.apply(java.lang.Object)java.lang.Object 
[error] called from japgolly.scalajs.react.Internal$FnComposer$$anonfun$apply$2$$anonfun$apply$3.apply(java.lang.Object)java.lang.Object 
[error] called from japgolly.scalajs.react.CompState$RootAccessor.modState(japgolly.scalajs.react.CompScope$CanSetState,scala.Function1,scala.Function0)scala.Unit 
[error] called from japgolly.scalajs.react.CompState$RootAccessor.modState(java.lang.Object,scala.Function1,scala.Function0)scala.Unit 
[error] called from japgolly.scalajs.react.CompState$WriteCallbackOps$class.modState(japgolly.scalajs.react.CompState$WriteCallbackOps,scala.Function1,scala.Function0)scala.Function0 
[error] called from japgolly.scalajs.react.CompState$ReadCallbackWriteCallback.modState(scala.Function1,scala.Function0)scala.Function0 
[error] called from org.example.client.playground.ReactStateSampleView$Backend.tick()scala.Function0 
[error] called from org.example.client.playground.ReactStateSampleView$Backend$$anonfun$start$1.apply$mcV$sp()scala.Unit 
... 
Caused by: java.lang.RuntimeException: There were linking errors 
    at scala.sys.package$.error(package.scala:27) ~[scala-library-2.11.8.jar:na] 
    at org.scalajs.core.tools.linker.frontend.BaseLinker.linkInternal(BaseLinker.scala:133) ~[na:na] 
    at org.scalajs.core.tools.linker.frontend.BaseLinker.linkInternal(BaseLinker.scala:86) ~[na:na] 
    at org.scalajs.core.tools.linker.frontend.LinkerFrontend$$anonfun$4.apply(LinkerFrontend.scala:54) ~[na:na] 
    at org.scalajs.core.tools.linker.frontend.LinkerFrontend$$anonfun$4.apply(LinkerFrontend.scala:54) ~[na:na] 
    at org.scalajs.core.tools.logging.Logger$class.time(Logger.scala:28) ~[na:na] 
    at org.scalajs.sbtplugin.Loggers$SbtLoggerWrapper.time(Loggers.scala:7) ~[na:na] 
    at org.scalajs.core.tools.linker.frontend.LinkerFrontend.link(LinkerFrontend.scala:53) ~[na:na] 
    at org.scalajs.core.tools.linker.Linker$$anonfun$link$1.apply$mcV$sp(Linker.scala:50) ~[na:na] 
    at org.scalajs.core.tools.linker.Linker$$anonfun$link$1.apply(Linker.scala:49) ~[na:na] 
+0

Каково точное сообщение об ошибке связывания и какие трассировки стека показаны выше? Эта информация имеет решающее значение для определения того, какая часть кода/зависимостей отвечает. – sjrd

+0

@sjrd, я обновил вопрос. Точки трассировки стека только на 'org.scalajs' –

+0

Я имел в виду трассировку стека * выше * сообщение« Были сообщения об ошибках связи ». Вот что интересно. В нем говорится, что нельзя связать. – sjrd

ответ

1

Увязка ошибка свидетельствует о том, что существует бинарная несовместимость между scalajs реагирует и Диод. Это звучит правдоподобно из ваших libraryDependencies, потому что:

Если произошло двоякое несовместимое изменение в scalajs-react-core от 0.11.1 до 0.11.3, это объяснит вашу проблему.

Если я прав, вы можете исправить эту проблему, обновив до Diode 1.1.0, which uses scalajs-react-core 0.11.3.

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