如何在外观中创建可选的“选项”?

时间:2016-01-11 08:08:46

标签: scala.js

我正在尝试为bootstrap popover函数创建一个可以使用多达11个可选参数的外观。在我的scalajs代码中,我想只传递我需要覆盖的参数,从库维护的合理默认值,即:PopoverOptions(animation = false),就像我在javascript中所做的那样。这似乎是建立立面的推荐方法,但它需要所有参数:

trait PopoverOptions extends js.Object {
  val animation: String = js.native
  val container: String = js.native
  val content: String = js.native
  ... 
}

object PopoverOptions {
  def apply(animation: String, container: String, content: String, ...): PopoverOptions = {
    js.Dynamic.literal(animation=animation, container= container, content = content, ...).asInstanceOf[PopoverOptions ]
  }
}

看起来一种方法是为每个可能的参数排列定义一个应用,但是当有很多覆盖参数时,这会过快:

def apply(animation: String): ...
def apply(container: String): ... 
def apply(animation: String, container: String): ...
...

创建带有大量覆盖参数的选项参数Facade的惯用方法是什么,这些参数通常具有合理的库维护默认值?

注意:两个答案都有优点/缺点,因此决定在不离开SO的情况下查看两种方式可能会有所帮助,所以这里是JSOptionBuilder方法的摘要:

import org.querki.jquery.JQuery
import org.querki.jsext._

@js.native
trait PopoverOptions extends js.Object
object PopoverOptions extends PopoverOptionBuilder(noOpts)
class PopoverOptionBuilder(val dict:OptMap) extends JSOptionBuilder[PopoverOptions, PopoverOptionBuilder](new PopoverOptionBuilder(_))
{
  def animation(v:String) = jsOpt("animation", v)
  def container(v:String) = jsOpt("container", v)
  def content(v:String) = jsOpt("content", v)
  ...
}

使用:PopoverOptions.animation("yay").container("container").content("bottom")._result

2 个答案:

答案 0 :(得分:1)

您可以使用Scala的参数默认值,并结合Veuillez entrer votre année de naissance : 2012 Veuillez entrer votre mois de naissance (de 01 à 12) : 30 Veuillez entrer votre mois de naissance (de 01 à 12) : 02 Veuillez entrer votre jour de naissance (de 01 à 31) : 30 Veuillez entrer votre jour de naissance (de 01 à 31) : 30 Veuillez entrer votre jour de naissance (de 01 à 31) : 30 Veuillez entrer votre jour de naissance (de 01 à 31) : 10 Confirmation de votre année de naissance: 10-2-2012 个元素类型,如下所示:

js.UndefOr

然后,您可以按照自己的意愿拨打object PopoverOptions { @inline def apply( animation: js.UndefOr[String] = js.undefined, container: js.UndefOr[String] = js.undefined, content: js.UndefOr[String] = js.undefined, ...): PopoverOptions = { val result = js.Dynamic.literal() animation.foreach(result.animation = _) container.foreach(result.container = _) content.foreach(result.content = _) ... result.asInstanceOf[PopoverOptions] } }

在定义网站上有点冗长,但它会完成工作。

答案 1 :(得分:1)

另一种方法是使用为此目的而创建的JSOptionBuilder。 (我写了很多jQuery外观,他们总是有这个问题。)JSOptionBuilder并不像过去那样重要(这是" |&之前的一个主要问题。 #34;运营商介绍),但我仍然发现它通常是处理复杂外墙的最佳方式。

此处the full description of this approach。 (请注意,这非常详细 - 上半部分是关键内容,其余部分涉及所有有些常见的边缘情况。)