2017-01-06 6 views
1

Я сторонник по торговле, но меня попросили перейти к проекту Scala, который использует платформу Play, и включает в себя Twirl. Я пытаюсь создать шаблон, который отображает несколько различных выходов в зависимости от строки, которая передается вScala/Twirl переменные и область/определение

Вот мой код:.

@(status: String)(implicit messages: Messages) 

@{ 
    if(status == "00") { 
     val pageTitle = "Page title" 
     val appStatus = "className" 
     val title = "message" 
     val subTitle = "message" 
     val step1Status = "className" 
     val step2Status = "className" 
     val step3Status = "className" 
     val image1 = "/customs/assets/images/image.png" 
     val image2 = "/customs/assets/images/image.png" 
     val image3 = "/customs/assets/images/image.png" 
     val optionalHeading = "" 
     val optionalParagraph = "" 
     val listContents = "<li>@Messages('message')</li><li>@Messages('message')</li>" 
     val optionalLink = "<br /><a class='button' href='@routes.DashboardController.display(custom)' role='button'>@Messages('message')</a>" 
    } 

    if(status == "01") { 
     //Other variables 
    } 
    if(status == "04") { 
     //Etc... 
    } 
} 

@layout(${pageTitle}) { 
     <div class="content__body"> 
      <div class="hero"> 
       <div class="${appStatus}"> 
        <h1 class="bold-large">@Messages(${title})</h1> 
        <p> 
         ${afterSubTitle} 
        </p> 
        <ol class="appstatus-steps"> 
         <li><span class="${step1Status}"><img alt="Complete" title="Complete" src=" + ${image1} + ">@Messages("messages.Received")</span></li> 
         <li><span class="${step2Status}"><img alt="Complete" title="Complete" src=" + ${image2} + ">@Messages("messages.Processing")</span></li> 
         <li><span class="${step3Status}"><img alt="Complete" title="Complete" src=" + ${image3} + ">@Messages("messages.Decision")</span></li> 
        </ol> 
       </div> 
      </div> 

      ${optionalHeading} 
      ${optionalParagraph} 

      <h2>@Messages("messages.next")</h2> 

      <ul class="list list-bullet"> 
       ${listContents} 
      </ul> 

      ${optionalLink} 
     </div> 
    } 

Итак, как вы можете видеть, идея заключается в том, что это страница вызывается с кодом (статусом) и на основе этой строки определяется ряд переменных, которые изменяют способ формирования страницы; содержание/классы CSS/изображений и т.д.

Это не работает (вы можете быть удивлены, узнав!) ​​

Это действительно неясно, почему это не хотя. Я думал, что вы обратились к переменным, используя формат $ {Variable}, но возможно, что вы должны использовать формат @Variable.

Даже когда я пытаюсь изменить их на @Variable, у меня все еще возникают проблемы, и я слабо понимаю, что это связано с областью действия Scala/Twirl, и есть ключевое слово «define», которое можно использовать. Я прочитал документацию, но я ее не понимаю.

Может ли кто-нибудь пролить свет на это?

EDIT

Хорошо, давайте рассмотрим следующий код вместо:

@(status: String)(implicit messages: Messages) 

@{ 
    if(status == "00") { 
     val myClass = "custom-class-1" 
    } 
    if (status == "01") { 
     val myClass = "custom-class-2" 
    } 
@layout("page title") { 
    <div class="@myClass">This is a div</div> 
} 

Так «все, что я хочу делать» :) есть возможность определить различные переменные, основываясь на и затем использовать эти переменные в шаблоне страницы.

Это имеет смысл? Я так новичок в Scala, поэтому Tuples/Defining теряется на меня в данный момент, но я учусь!

ответ

1

ответ по @pedrorijio практически соответствует действительности, но фактический код, который работал для меня в конце, был следующим:

@myClass = @{status match { 
    case "00" => "custom-class-1" 
    case "01" => "custom-class-2" 
}} 

Благодарим за помощь!

+0

О, небольшая ошибка :) В twirl всегда есть некоторые трюки, следовало бы попробовать на intellij: p – pedrorijo91

+0

Ah! Это вихрь? Я задавался вопросом, не так ли, - не мог бы разобрать его без тебя, хотя так спасибо! –

1

Вы, кажется, больше используется для яваскрипта переменных и областей :)

В Scala и Twirl, если только определить переменную (в данном случае это значение, потому что это неизменная) внутри, если заявление, значение доступен только внутри, если блок

Одно из решений может заключаться в том, если заявление возвращать кортеж со всеми переменными, и использовать силу операции присваивания, например:

val (myA, myB, myC) = if(something) { 
val a = "a" 
val b = "b" 
val c = "c" 

(a,b,c) // this will return the 3 variables/values because if statements are an expression, and expressions return something 
} else { 
val a = "A" 
val b = "B" 
val c = "C" 

(a,b,c) 
} 

// now you have a,b,c defined in this scope and you can do whatever you need with them 

если вы хотите возвращать разные переменные в зависимости от в выражении if у вас будет больше осложнений.решение было бы сделать не нужно переменные null или Option

Позволь мне знать, если вам нужно что-нибудь еще лучше объяснить :)

EDIT: решение для уменьшенного редактируемого примера

У меня нет ничего, чтобы проверить, не компилируется ли он, но это должно быть примерно так:

@(status: String)(implicit messages: Messages) 

@{ 
    val myClass = if(status == "00") { 
     "custom-class-1" 
    } else if (status == "01") { 
     "custom-class-2" 
    } else { 
     "" 
    } 

@layout("page title") { 
    <div class="@myClass">This is a div</div> 
} 

Alternative используя поиск по шаблону:

заменить если/другое заявление с:

val myClass = status match { 
      case "00" => "custom-class-1" 
      case "01" => "custom-class-2" 
      case _ => "" 
     } 

(case _, как "в любом другом случае")

+0

Спасибо! Вы абсолютно правы, JS - это намного больше! Я отредактировал свое оригинальное сообщение с гораздо меньшим фрагментом кода. Сможете ли вы предоставить отработанное решение для этого, чтобы я мог видеть, как отформатировать мой код? –

+1

только что сделал @SonyaBaled :) – pedrorijo91

+0

Хорошо. Я дал это, но у меня такая же проблема, как и раньше: значение «myClass» не найдено. Я подумал, что это связано с тем, что в заявлениях «Скала» есть какие-то утверждения, но я могу быть совершенно неправ, поскольку я так новичок в этом! Есть идеи? –

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

  • Нет связанных вопросов^_^