6

Mam następujący kod w grze 2.0 szablonu:Zagraj 2.0 templating - match` Scala `i` val` nie skompilować w widoku szablonu

@content.toString.lines.map{ 
    case line =>  // i put `case` here as another attempt to make it work 
    line match { 
     case "" => @Html("") 
     case _ => <li>@Html(line)</li> /*CRASH*/ 
    } 
} 

To nie działa na zaznaczonej linii, mówiąc, że not found: value line. Drugi wariant to:

@for(line <- content.toString.lines){ 
    @line match {       /*CRASH*/ 
     case "" => @Html("") 
     case _ => <li>@Html(line)</li> 
    } 
} 

nie na zaznaczonej linii, twierdząc, że 'case' expected but identifier found.

UPDATE:

samo dotyczy val:

@val headID = "head" 

wyjdzie z illegal start of simple expression.

UPDATE KONIEC

Chciałbym wiedzieć, co robię źle i jak prawidłowo wdrożyć struktury match-case i val zadanie w szablonach Play?

Odpowiedz

22

Korzystanie match wyrażeń w szablonach

trzeba ująć w nawiasy klamrowe („{” i „}”) zawartość HTML z szablonów:

@for(line <- content.toString.lines) { 
    @line match { 
    case "" => { } 
    case _ => { <li>@Html(line)</li> } 
    } 
} 

w Twoim konkretnym przypadku, następujący kod będzie czytać lepsze IMHO:

@content.toString.lines.collect { 
    case line if !line.isEmpty => { <li>@Html(line)</li> } 
} 

Definiowanie wartości

Można zdefiniować wartości używając defining[T](value: T)(usage: T => Html) pomocnika:

@defining(1 + 2 * 3) { value => 
    <div>@value</div> 
} 
1

następujący wydaje się działać dla mnie

@content.toString.lines.map{ line => 
    line match { 
     case "" => @Html("") 
    case _ => <li>@Html(line)</li> 
} 

ciężko na oczy, ale można spojrzeć na target/scala-2.9.1/src_managed/main/views/html/index.template.scala w katalogu projektu zabaw, aby zobaczyć, co jej umieszczenie w napisowych.

chodzi o val zadania, nie wiem, ale @defining może pomóc

4

Okazało się, że dodać {} na zewnątrz, aby ująć cały kod będzie działać

@{content.toString.lines.map{ line => 
    line match { 
    case "" => @Html("") 
    case _ => <li>@Html(line)</li> 
}} 
+0

Lifesaver! Po zadrapaniu mojej głowy przez ponad godzinę na tym stwierdziłem, że to też działa dla mnie. Całkowicie nieoczekiwane, ponieważ mam inne pliki w ramach tego samego projektu, praktycznie identyczne pod względem struktury, które tego nie potrzebują, a jedyną możliwą różnicą jest to, że używam pola parametru przekazywanego w przeciwieństwie do przekazywanego parametru (@xf versus @x) JEDNAK edytowałem kod i próbowałem bezpośrednio przekazać param i nadal go nie skompilowałem. Chociaż może to być .xml versus .html i to też nie miało znaczenia.Dziękuję za odpowiedź! – Techmag

+0

W przypadku czegoś dziwnego, co zacząłem kompilować nagle - to było błądzące Z (cudownym lekiem) owiniętym aparatem ortodontycznym, a kiedy je usunąłem, nowe błędy zniknęły, ale cały plik skompilował się czysto. Szybko próbowałem wycofać wszystkie zmiany, które wprowadziłem w ciągu ostatnich kilku godzin, aby sprawdzić, czy uda mi się trafić na prawdziwego winowajcę, ale bez skutku. Sugerowałbym głębsze kopanie, jeśli tak się stanie, ponieważ szelki jakoś maskują głębszy problem. – Techmag

0

Kolejną częstą przyczyną ten błąd polega na założeniu klamry początkowej w osobnej linii:

@x match { 
case y => 
    { //offending brace, put it back on the same line as case 
    } //This can go anywhere 
} 
Powiązane problemy