首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Binding.scala:更新值时如何调用副作用?

Binding.scala:更新值时如何调用副作用?
EN

Stack Overflow用户
提问于 2018-02-26 00:01:56
回答 2查看 615关注 0票数 1

我的应用程序中有一个地理坐标列表,存储在一个Vars[Coordinates]中。现在,我希望在地图上显示这些内容,并在向列表中添加或删除新坐标时自动更新地图。我使用一个公开API的库在地图上添加和删除标记,所以我想在更新列表时调用这些标记,但是我找不到任何明显的方法。对于如何做到这一点,有什么建议吗?

编辑:谢谢杨波的回复!最后我得到了这样的结果:

代码语言:javascript
复制
val coordinates = Vars.empty[Coordinates]
def mapMountPoint(parent: Element, coordinates: BindingSeq[Coordinates]) =
  new MultiMountPoint[Coordinates](coordinates) {
    … // method overrides here to create the map in parent
  }
@dom 
def map = {
  val e = <div></div>
  mapMountPoint(e, coordinates).bind
  e
}

它似乎可以在呈现或从DOM…中删除div时调用挂载和卸载方法。但这真的是该怎么做的吗?它看起来有点奇怪,我还会收到一个编译器警告,我在这里调用.binda pure expression does nothing in statement position; multiline expressions might require enclosing parentheses

在monadic-html库中,有一种非常优雅的方法:

代码语言:javascript
复制
<canvas mhtml-onmount={ e => crazyCanvasStuff(e) }></canvas>

还有一个匹配的mhtml-onun挂载属性来进行清理。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-26 07:00:33

您可能希望创建自己的MultiMountPoint,它覆盖spliceset方法。

然后将挂载点注入呈现过程,类似于https://stackoverflow.com/a/45101054/955091

与Haskell不同,您可以在Scala中到处执行副作用,甚至在HTML模板中也是如此。如果您编写了类似于<canvas id="my_canvas" data:dummy_attribute={ crazyCanvasStuff(my_canvas, coordinates.all.bind); "dummy_value" }></canvas>的东西,那么它也应该能工作。

但是,执行副作用的其他解决方案是而不是推荐的,因为它们的行为依赖于Binding.scala的内部实现。例如,当Binding.scala运行时查找上游数据不变(Binding.scala路由器)时,可能不会重新评估副作用。使用挂载点是执行副作用的唯一正确方法,特别是在需要部分更新或希望管理呈现期间创建的自定义对象的生命周期时。

票数 1
EN

Stack Overflow用户

发布于 2018-03-06 15:48:48

我使用https://github.com/rtimush/scalatags-rx

build.sbt: libraryDependencies += "com.timushev“%%

例句:如果按下按钮,就会出现偶数颜色,使用刻度.

代码语言:javascript
复制
var colorActiv = "green"
var colorInActiv = "black"

val buttonDateColor = Var(colorInActiv) // big V in Var
val buttonDateRx = Rx(buttonDateColor())

..。

代码语言:javascript
复制
def buttonDateOnclick(): Unit = {
    if (buttonDateColor.now == colorInActiv){
        buttonDateColor() = colorActiv
    } else {
        buttonDateColor() = colorInActiv
    }
}

.在Menubuttons对象中:

代码语言:javascript
复制
var menuButtons =
div(
    button(
        menubuttonClass,
        color := buttonDateRx,
        onclick := buttonDateOnclick _,
        "button-text"
    )

..。在main/initialize()中:

代码语言:javascript
复制
dom.document.getElementById("buttonsdiv").appendChild(Menubuttons.menuButtons.render)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48979790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档