我有一个基于Aurelia的单页应用程序,我试图让它与现有的SignalR后端一起工作。我已经下载了SignalR javascript客户端并手动将其与Aurelia应用程序集成(即我没有使用代理文件)。我能够连接到SignalR集线器并在控制台中查看arrvive消息....到目前为止一切顺利。现在,我尝试使用Aurelia事件聚合器,以便在新的集线器消息到达时触发事件,并且应用订阅该特定事件的任何组件都将执行一些工作。问题是SignalR事件回调似乎无法访问Event Aggregator对象。以下是解释此问题的代码:
//Import statements omitted for brevity
@inject (EventAggregator)
export class MyService{
constructor(eventAggregator) {
this.ea = eventAggregator;
this.connection = $.hubConnection("http://localhost:8080/signalr", { useDefaultPath: false });
this.hub = this.connection.createHubProxy("myHub");
//Register a callback function to fire when a new hub message arrives
this.hub.on("sendMessage", this.processHubMessage);
//No issues so far - all this constructor code works fine
}
processHubMessage(message) {
// This doesn't work - this.ea is undefined in the scope of this function
this.ea.publish('deviceStatusUpdate', message);
}
}
回调函数中引用的事件聚合器对象未定义 - 我假设因为它未在类的范围内被调用。有办法解决这个问题吗?如何给回调函数访问类属性(在我的示例中为this.ea)。
答案 0 :(得分:3)
尝试使用
this.hub.on("sendMessage", (message) => this.processHubMessage(message));
由于this
不是您期望的那样,它失败了。通过使用胖箭头函数,this
就是您所期望的。这是JavaScript的一个非常令人沮丧的部分,但胖箭为它提供了一个简单的解决方法。
答案 1 :(得分:0)
我认为你错过了代理服务器的'start',也可能需要为你的视图模型添加别名以传递给HubProxy。
这对我有用:
Public Async Function GetMessages(ByVal folder As Global.Google.Apis.Gmail.v1.Data.Label) As Task(Of List(Of Global.Google.Apis.Gmail.v1.Data.Message))
If Not (Me.isAuthorizedB) Then
Throw New InvalidOperationException(Me.authExceptionMessage)
Else
Dim msgsRequest As UsersResource.MessagesResource.ListRequest = Me.client.Users.Messages.List("me")
With msgsRequest
.LabelIds = New Repeatable(Of String)({folder.Id})
.MaxResults = 50
'.Key = "YOUR API KEY"
End With
Dim msgsResponse As ListMessagesResponse = Await msgsRequest.ExecuteAsync()
Dim messages As New List(Of Global.Google.Apis.Gmail.v1.Data.Message)
Do While True
For Each msg As Global.Google.Apis.Gmail.v1.Data.Message In msgsResponse.Messages
Dim msgRequest As UsersResource.MessagesResource.GetRequest = Me.client.Users.Messages.Get("me", msg.Id)
msgRequest.Format = MessagesResource.GetRequest.FormatEnum.Full
Dim newMsg As Message = Await msgRequest.ExecuteAsync()
messages.Add(newMsg)
Next msg
If Not String.IsNullOrEmpty(msgsResponse.NextPageToken) Then
msgsRequest.PageToken = msgsResponse.NextPageToken
msgsResponse = Await msgsRequest.ExecuteAsync()
Else
Exit Do
End If
Loop
Return messages
End If
End Function