无法使用Aurelia Event Aggregator发布SignalR客户端事件

时间:2016-03-28 02:09:00

标签: aurelia signalr.client aurelia-event-aggregator

我有一个基于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)。

2 个答案:

答案 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