反应视图未成功收听存储
React view not successfully listening to store
我有 a React controller-view 订阅了两个不同的商店,并启动了将导致每个商店发出的调用:
componentWillMount() {
UserStore.addChangeListener(this._onChange);
EventStore.addChangeListener(this._onChange);
}
componentDidMount() {
UserService.getUser(this.props.params.slug)
EventService.fetchEventsForUser(this.props.params.slug);
}
对于 UserStore
听众来说,这很好用。用户从 API 获取,返回到 the UserStore
,发出更改。如果我放入 console.log
语句,我可以完全按照我期望的方式看到所有这些流程,以我的控制器视图的 _onChange
函数结束。
但是。 由于某些无法解释的原因,添加到 the EventStore
的更改侦听器没有触发。事件从 API 中正确获取,并返回到我期望的 EventStore
方法,它正确更新 EventStore
的内部状态,甚至触发 emitChange()
很好(我已经用大量 console.log
语句进行了验证)。但是控制器视图中的 _onChange
永远不会被调用!
我已经尝试解决此问题近两位数的时间了。我觉得没有比开始时更接近答案了。我什至不知道去哪里看。
其他说明
- 我尝试从我的控制器视图中删除
UserStore
侦听器,只是在 UserStore
中设置静态内容。我想也许两次更新之间可能存在竞争条件。没有任何变化。
- 我尝试将控制器视图的
_onChange
拆分为两个单独的函数,再次怀疑它们不能很好地协同工作。但是 console.log
显示 _onUserChange
按预期被调用,但是 _onEventChange
根本没有被调用。
- 这曾经有效! 在我一直链接到分支的拉取请求的主分支中,它有效!一切的结构都有点不同,我一直链接到的控制器视图只监听
UserStore
中的变化,而它的子组件监听 EventStore
中的变化。但是,如果我复制这个结构,它仍然不起作用。在我的新分支中,任何正在监听 EventStore
中的变化的组件似乎对这些变化完全充耳不闻。
- 同样在
master
上,EventStore
进行了比现在多得多的计算。不过,我非常怀疑它的速度很慢会让听众更有可能听到它。 UserStore
相当简单,听者听得没问题。
- 有时 确实 有效。 100 次加载大约 1 页,它有效。组件更新其状态,服务器加载的内容实际显示。我无法重现此问题或确定是什么原因造成的。
- Another component in this app 也监听
EventStore
变化,但也很少听到它们。
- 您可以看到它在 http://life.chadoh.com/#/chadoh. If you then visit http://life.chadoh.com/#/chadoh/week/0, you'll see that an event has correctly been loaded from the server. But for some reason the listeners were not alerted. If you refresh the page on http://life.chadoh.com/#/chadoh/week/0 无法工作,侧边栏将永远不会更新事件(区别在于它最初是在
EventStore
已经加载数据之前还是之后呈现) .
- 将
EventStore
中的 get events()
方法更改为常规 events()
无效。
- 将
EventService.fetchEvents
调用放在 setTimeout
中不会产生更好的结果。
- 将
listen
调用放在构造函数中不会产生更好的结果。
我看到 EventsStore
扩展了 BaseStore
,它扩展了 events.EventEmitter
。那是 node.js 标准库事件发射器吗?
如果是这样,您可能在 _events
上有命名冲突。
您的商店使用 _events
来保存数据:https://github.com/chadoh/life/blob/no-dates/src/stores/EventStore.js#L10
但是EventEmitter
也使用_events
来存储事件处理程序:https://github.com/joyent/node/blob/d13d7f74d794340ac5e126cfb4ce507fe0f803d5/lib/events.js#L140-L186
因此,事件数据可能会覆盖事件处理程序的集合,导致处理程序永远不会触发(因为它们不存在!)。
您可以尝试使用不同的密钥来保存数据(例如 _eventData
),看看是否能解决您的问题!
我有 a React controller-view 订阅了两个不同的商店,并启动了将导致每个商店发出的调用:
componentWillMount() {
UserStore.addChangeListener(this._onChange);
EventStore.addChangeListener(this._onChange);
}
componentDidMount() {
UserService.getUser(this.props.params.slug)
EventService.fetchEventsForUser(this.props.params.slug);
}
对于 UserStore
听众来说,这很好用。用户从 API 获取,返回到 the UserStore
,发出更改。如果我放入 console.log
语句,我可以完全按照我期望的方式看到所有这些流程,以我的控制器视图的 _onChange
函数结束。
但是。 由于某些无法解释的原因,添加到 the EventStore
的更改侦听器没有触发。事件从 API 中正确获取,并返回到我期望的 EventStore
方法,它正确更新 EventStore
的内部状态,甚至触发 emitChange()
很好(我已经用大量 console.log
语句进行了验证)。但是控制器视图中的 _onChange
永远不会被调用!
我已经尝试解决此问题近两位数的时间了。我觉得没有比开始时更接近答案了。我什至不知道去哪里看。
其他说明
- 我尝试从我的控制器视图中删除
UserStore
侦听器,只是在UserStore
中设置静态内容。我想也许两次更新之间可能存在竞争条件。没有任何变化。 - 我尝试将控制器视图的
_onChange
拆分为两个单独的函数,再次怀疑它们不能很好地协同工作。但是console.log
显示_onUserChange
按预期被调用,但是_onEventChange
根本没有被调用。 - 这曾经有效! 在我一直链接到分支的拉取请求的主分支中,它有效!一切的结构都有点不同,我一直链接到的控制器视图只监听
UserStore
中的变化,而它的子组件监听EventStore
中的变化。但是,如果我复制这个结构,它仍然不起作用。在我的新分支中,任何正在监听EventStore
中的变化的组件似乎对这些变化完全充耳不闻。 - 同样在
master
上,EventStore
进行了比现在多得多的计算。不过,我非常怀疑它的速度很慢会让听众更有可能听到它。UserStore
相当简单,听者听得没问题。 - 有时 确实 有效。 100 次加载大约 1 页,它有效。组件更新其状态,服务器加载的内容实际显示。我无法重现此问题或确定是什么原因造成的。
- Another component in this app 也监听
EventStore
变化,但也很少听到它们。 - 您可以看到它在 http://life.chadoh.com/#/chadoh. If you then visit http://life.chadoh.com/#/chadoh/week/0, you'll see that an event has correctly been loaded from the server. But for some reason the listeners were not alerted. If you refresh the page on http://life.chadoh.com/#/chadoh/week/0 无法工作,侧边栏将永远不会更新事件(区别在于它最初是在
EventStore
已经加载数据之前还是之后呈现) . - 将
EventStore
中的get events()
方法更改为常规events()
无效。 - 将
EventService.fetchEvents
调用放在setTimeout
中不会产生更好的结果。 - 将
listen
调用放在构造函数中不会产生更好的结果。
我看到 EventsStore
扩展了 BaseStore
,它扩展了 events.EventEmitter
。那是 node.js 标准库事件发射器吗?
如果是这样,您可能在 _events
上有命名冲突。
您的商店使用 _events
来保存数据:https://github.com/chadoh/life/blob/no-dates/src/stores/EventStore.js#L10
但是EventEmitter
也使用_events
来存储事件处理程序:https://github.com/joyent/node/blob/d13d7f74d794340ac5e126cfb4ce507fe0f803d5/lib/events.js#L140-L186
因此,事件数据可能会覆盖事件处理程序的集合,导致处理程序永远不会触发(因为它们不存在!)。
您可以尝试使用不同的密钥来保存数据(例如 _eventData
),看看是否能解决您的问题!