2016-04-05 2 views
2

Я пытаюсь использовать проект кросс-сборки ScalaJs с Play Framework 2.5. У меня возникла проблема, когда я пытаюсь запустить тесты для Client.scala. Ошибка, которую я получаю, -ScalaJs With Play Framework (ошибка в тестах)

, вызванный: TypeError: Невозможно вызвать метод «appendChild» null.

Client сниппет

@JSExport 
object DashboardClient extends js.JSApp { 
@JSExport 
def main(): Unit = { 
val dashboard = new Dashboard 
dom.document.getElementById("bodyContent").appendChild(dashboard.bodyFrag.render) 
} 

Это bodyFrag находится внутри другого класса

def bodyFrag = 
div(
    div(
    `class` := "row border-bottom", 
    div(
     `class` := "col-md-12", 
     div(
     `class` := "col-md-2 image-alignment", 
     img(width := "161", src := "/assets/images/mountain.jpg") 
    ), 
     div(`class` := "col-md-10") 
    ) 
), 
    div(
    `class` := "row border-bottom", 
    div(
     `class` := "col-md-12", 
     div(
     `class` := "col-md-12", 
     h1(`class` := "text-center", "Dashboard") 
    ) 
    ) 
) 
) 

Так что, когда я пытаюсь тест использует utest я получаю вышеуказанную ошибку. Пожалуйста, помогите.

P.S - Я совершенно не знаком с Scala и ScalaJs.

ответ

2

Ну, ошибка, похоже, не имеет отношения к bodyFrag. (Или Play, или даже Scala.js, на самом деле.) Ошибка в буквальном смысле говорит о том, что getElementById("bodyContent") имеет значение NULL, что означает, что он еще не существует. Я предполагаю, что это объявлено в HTML.

Это общая ловушка в коде браузера. Вам нужно подождать, пока DOM будет готов, прежде чем вы попытаетесь манипулировать им; вы не показываете HTML-страницу, поэтому я не уверен, что вы это делаете, но я подозреваю, что нет.

Существует множество способов дождаться готовности DOM - общий (но медленный) подход onload и подход jQuery, обсуждаются in the jQuery documentation. В качестве быстрого исправления я бы рекомендовал обернуть вызов вашего кода Scala.js внутри window.onload.