【发布时间】: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 我正在尝试创建一个视觉/投影编程工具。有代表编程元素的节点,例如一个变量、表达式等。一个变量可以有一个名字,多个表达式可以引用一个变量。如果我更改变量的名称,我希望在每个显示对它的引用的地方都更改它的名称。此外,如果我更改对另一个变量的引用,它应该显示新变量的名称。您能否提供更多关于我将如何在不改变数据的情况下进行的线索?我想避免在每次交互时复制整个图表。