web/mhtml

javascript callback 처리 하기 - dropdown

wefree 2021. 10. 25. 14:01

문제

scalajs 에서 fomantic-ui dropdown module 을 사용하기 위해서는 javascript callback 을 등록해 줘야 한다.

dropdown 동작 방식 처리는 아래와 같이 2가지로 할 수 있다.

  • dropdown 메뉴에서 아이템이 선택되면 바로 UI 갱신 (reactive)
  • 아이템을 선택한 후 별도의 버튼을 누르면 그 때 선택된 아이템을 읽어 UI 갱신 (non-reactive)  

fomantic-ui example 을 대상으로 mhtml 을 함께 사용해 구현해 보자

코드

reactive 방식

import mhtml._
import org.scalajs.dom
import scala.scalajs.js

val selectedGender: Var[String] = Var("")

val dropdownHandler: js.Function2[String, String, Unit] = 
    (text, value) => selectedGender := value
    
val content =
     <div>
         <div id="MY_MENU" class="ui selection dropdown">
             <input type="hidden" name="gender"></input>
             <i class="dropdown icon"></i>
             <div class="default text">Gender</div>
             <div class="menu">
                 <div class="item" data-value="male">Male</div>
                 <div class="item" data-value="female">Female</div>
             </div>
         </div>
         <div>selected: {selectedGender}</div>
     </div>

mount(dom.document.getElementById("main_content"), content)

js.Dynamic.global
    .$("#MY_MENU")
    .dropdown(js.Dictionary("onChange" -> dropdownHandler))

 

non-reactive 방식

위의 reactive 방식에서 mhtml 의 sampleOn 을 응용해 구현할 수도 있고, 아래처럼도 가능하다.

import mhtml._
import org.scalajs.dom
import scala.scalajs.js

val selectedGender: Var[String] = Var("Gender")

val content =
    <div>
        <div id="MY_MENU" class="ui selection dropdown">
            <input type="hidden" name="gender"></input>
            <i class="dropdown icon"></i>
            <div class="default text">Gender</div>
            <div class="menu">
                <div class="item" data-value="male">Male</div>
                <div class="item" data-value="female">Female</div>
            </div>
        </div>
        <button onclick={ () => selectedGender := js.Dynamic.global.$("#MY_MENU").dropdown("get text").asInstanceOf[String] }>read selected</button>
        <div>selected: {selectedGender}</div>
    </div>

mount(dom.document.getElementById("main_content"), content)
js.Dynamic.global.$("#MY_MENU").dropdown()