【发布时间】:2018-08-05 09:28:57
【问题描述】:
我的应用程序中有一个地理坐标列表,存储在Vars[Coordinates] 中。我现在想在地图上显示这些,并在将新坐标添加到列表中或从列表中删除时自动更新地图。我正在使用一个库来公开 API 以在地图上添加和删除标记,所以我想在列表更新时调用这些,但我找不到任何明显的方法来做到这一点。关于如何实现这一点的任何提示?
edit:感谢@杨波的回复! 我最终得到了这样的结果:
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
}
它似乎工作,当 div 被渲染或从 DOM 中删除时调用 mount 和 unmount 方法……但这真的是应该这样做的吗?看起来有点奇怪,而且我在调用 .bind:a pure expression does nothing in statement position; multiline expressions might require enclosing parentheses 时也会收到编译器警告。
在 monadic-html 库中,有一个相当优雅的方法:
<canvas mhtml-onmount={ e => crazyCanvasStuff(e) }></canvas>
还有一个匹配的 mhtml-onunmount 属性用于清理。
【问题讨论】:
-
在 HTML 模板中调用副作用是危险的。我认为为副作用提供“优雅”的语法糖不是一个好主意。
-
我不得不说我不同意。也许这很危险,但为了重用与 DOM 交互的库,这只是必要的,所以我认为它应该很简单。哦,好吧,这是你的项目 ;-)
-
MultiMountPoint看起来像rarely used feature。你真的认为值得为此分配一个特殊的语法吗? -
它可能很少使用,但我认为它仍然是一个重要的功能。一个好的框架应该可以很容易地重用现有的库,我认为在数据绑定上下文中,这意味着我可以在要显示的数据发生变化时轻松调用 JavaScript API。
-
您不需要特殊属性来执行副作用,请参阅stackoverflow.com/a/45101054/955091中的解决方案1
标签: scala data-binding scala.js side-effects binding.scala