【发布时间】:2017-04-10 10:58:43
【问题描述】:
在我的 Ember 2.8 应用程序中,我正在服务中建立 Websocket 连接。当用户登录时,连接 URL 会发生变化(然后将用户身份验证令牌作为查询参数包含在内)。
目前的用户服务很简单:
CurrentUserService = Ember.Service.extend(
name: "current-user"
user: null
load: ->
// Do some stuff
@set("user", user)
)
它完全按预期工作,我用它在页面上显示当前用户的用户名(除其他外)。
在 Websocket 服务中,我所做的只是根据 currentUser.user 创建一个计算属性,用于建立连接(取决于用户是否登录):
ActionCableService = Ember.Service.extend(
name: "action-cable"
cable: service()
currentUser: service()
testObs: Ember.observer("currentUser", ->
console.log "currentUser changed, #{ @get("currentUser.user") }"
)
consumer: Ember.computed("currentUser.user", ->
consumerUrl = "ws://localhost:10000/cable"
if @get("currentUser").user?
consumerUrl += "?token=#{ @get("currentUser.user.authToken") }"
console.log(consumerUrl)
return @get("cable").createConsumer(consumerUrl)
)
)
问题是,消费者属性永远不会更新。它在页面加载时设置一次,当 currentUser 服务的用户属性更改时,consumer 不会更新,我的测试观察者也不会更新。
刷新页面时,有时会使用登录的consumerUrl,有时不会。
我猜有时会先恢复会话,有时会先发生动作电缆服务。
当动作有线电视服务首先加载时,我期望发生的事情是:
- Action cable 服务已加载,当前未设置用户,连接到公共 websocket
- 处理从会话数据中恢复用户的逻辑触发,设置
currentUser.user(发生这种情况,我可以在我的页面上看到用户名) -
consumer计算属性注意到currentUser.user更改并连接到私有 consumerUrl(不会发生)
我可以很容易地以一种不依赖于计算属性的方式解决这个问题,但我想知道这里出了什么问题。
【问题讨论】:
标签: ember.js coffeescript