【问题标题】:How can I create a Bacon.Property representing a property in a referenced object?如何创建表示引用对象中的属性的 Bacon.Property?
【发布时间】:2015-12-16 16:10:34
【问题描述】:

我已经开始使用 Bacon.js,但遇到了一个我找不到任何示例的问题。

我有一组节点,可能会引用其他节点。

在命令式代码中看起来像这样:

alice = { name: "Alice" }
bob   = { name: "Bob" }
carol = { name: "Carol" }

alice.likes = bob
bob.likes = carol
alice.likes.name //=> "Bob"

bob.name = "Bobby"
alice.likes.name //=> "Bobby"

alice.likes = carol
alice.likes.name //=> "Carol"

现在,我想拥有一个 alice.likes.name 的属性,它必须更改 每当alice.likes 指向不同的对象,或者name 的属性 alice.likes 中的当前对象发生变化。

我想出了下面的代码(LiveScript 语法),它正确记录了 3 条消息:Bob、Bobby、Carol。

我使用Bus 进行测试。

mkBus = (initialValue) ->
  bus = new Bacon.Bus()
  property = bus.toProperty(initialValue)
  property.push = (newValue) -> bus.push(newValue)
  property

alice = { pName: mkBus("Alice"), pLikes: mkBus(null) }
bob   = { pName: mkBus("Bob"),   pLikes: mkBus(null) }
carol = { pName: mkBus("Carol"), pLikes: mkBus(null) }

alice.pLikes.onValue (person) ->
  if person
    person.pName.onValue (vName) ->
      console.log vName

alice.pLikes.push(bob)
bob.pLikes.push(carol)

# Change name
bob.pName.push("Bobby")

# Change reference
alice.pLikes.push(carol)

问题:如何创建一个代表alice.likes.name 名称的属性?

即:

nameOfAlicesFavourite.onValue (vName) ->
  console.log vName

我是 FRP 新手,如果我做错了什么,请告诉我。

【问题讨论】:

  • 更改人名很奇怪。但除此之外,看看flatMap
  • 您使用flatMapLatest 的解决方案很好。我建议重新思考你如何为世界建模:你的例子是面向对象的思维,改变其状态的实体 == 可变数据。您能否重塑您的问题,使数据只是数据并且永远不会发生变异。显然,您并没有真正与人及其姓名一起工作,因此很难给出更具体的建议。
  • @OlliM 我正在​​尝试创建一个视觉/投影编程工具。有代表编程元素的节点,例如一个变量、表达式等。一个变量可以有一个名字,多个表达式可以引用一个变量。如果我更改变量的名称,我希望在每个显示对它的引用的地方都更改它的名称。此外,如果我更改对另一个变量的引用,它应该显示新变量的名称。您能否提供更多关于我将如何在不改变数据的情况下进行的线索?我想避免在每次交互时复制整个图表。

标签: frp bacon.js


【解决方案1】:

感谢@Bergi 将我指向flatMap

flatMap 为源中的每个事件创建一个新流。我使用了flatMapLatest,因此只有最新喜欢的人的姓名更改会在输出流上传输。

代码如下:

nameOfAlicesFavourite = alice.pLikes.flatMapLatest (person) ->
  if person
    person.pName
  else
    Bacon.never!

【讨论】:

    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多