Skip to content

Allow usage of custom tags defined in native js libraries #43

@sb-minimal

Description

@sb-minimal

I read through the issues of custom tags but must admit, that i did not fully understand if it is possible to extend Binding.scala with custom tags.

Say OnsenUI defines a custom tag <ons-page>, how can i use this in Binding.scala?

I tried the following wrapper

package onsen

import com.thoughtworks.binding._
import Binding._
import org.scalajs.dom.document
import org.scalajs.dom.raw.Node

import scala.language.implicitConversions
import scala.scalajs.js
import scala.scalajs.js.annotation.JSName

case class OnsenBasicComponentBuilder(tagName: String) {

  def render = this

  var modifier: Binding[String] = _

  @dom def build = {
    val element=document.createElement(tagName)
    element.setAttribute("modifier",modifier.bind)
    element
  }
}

object Onsen {
  implicit def autoBinding[A](a: A): Binding[A] = ???

  implicit final class CustomTags(x: dom.Runtime.TagsAndTags2.type) {

    def OnsPage() = OnsenBasicComponentBuilder("ons-page")
    def OnsToolbar() = OnsenBasicComponentBuilder("ons-toolbar")
    def OnsToolbarButton() = OnsenBasicComponentBuilder("ons-toolbar-button")
    def OnsIcon() = OnsenBasicComponentBuilder("ons-icon")
    def OnsButton() = OnsenBasicComponentBuilder("ons-button")

  }

  implicit def toHtml(x: OnsenBasicComponentBuilder): BindingSeq[Node] = {
    Constants(x.build).mapBinding(identity)
  }
}

and use it as follows

import onsen.Onsen._
  @dom
  def page = {
    <div>
      <OnsPage><OnsToolbar></OnsToolbar></OnsPage>
    </div>
  }

getting

overloaded method constructor NodeSeqMountPoint with alternatives:
[error]   (parent: org.scalajs.dom.raw.Node,childBinding: com.thoughtworks.binding.Binding[org.scalajs.dom.raw.Node])com.thoughtworks.binding.dom.Runtime.NodeSeqMountPoint <and>
[error]   (parent: org.scalajs.dom.raw.Node,childBinding: com.thoughtworks.binding.Binding[com.thoughtworks.binding.Binding.BindingSeq[org.scalajs.dom.raw.Node]],dummy: Unit)com.thoughtworks.binding.dom.Runtime.NodeSeqMountPoint <and>
[error]   (parent: org.scalajs.dom.raw.Node,childrenBinding: com.thoughtworks.binding.Binding.BindingSeq[org.scalajs.dom.raw.Node])com.thoughtworks.binding.dom.Runtime.NodeSeqMountPoint
[error]  cannot be applied to (onsen.OnsenBasicComponentBuilder, com.thoughtworks.binding.Binding.BindingSeq[org.scalajs.dom.raw.Node])
[error]       <OnsPage><OnsToolbar></OnsToolbar></OnsPage>
[error]        ^

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions