8

所以我正在集成 SignalR 和 HotTowel,虽然我真的认为这是如何与 Durandal 本身集成的问题。

问题是我显然有多种观点。其中一些观点我想回应 SignalR 消息。问题是如何进行这种集成,因为在我调用 SignalR 的集线器启动方法之前必须启动 SignalR 事件。

所以以我有view1和view2为例。我希望每个人在收到 SignalR 消息时和在该视图的上下文中做一些事情(所以让我们说以某种方式更新 DOM)。这显然是一个 SPA,因此为每个视图调用 SignalR 启动方法似乎是个坏主意,因此在启动时启动 SignalR 听起来像是正确的计划,但那时我的视图可能尚未加载,我仍然如何确保我的事件具有页面的正确上下文。

这是基于我的理解,即必须在调用 start 之前注册 SignalR 的所有事件。StackOverflow 的聪明人有什么想法吗?

编辑以扩展问题

该网站的一部分涉及上传文件以进行解析和处理以导入数据库。我创建了一个视图,其中选择了文件并将其上传(使用 FineUploader)到 WebApiController。控制器执行检查上传文件的基本步骤,然后启动异步任务以实际进行解析和处理,同时立即返回基本的“是的,上传正常”消息。

这会导致“进行中”文件列表刷新并且文件显示为“已上传”状态。随着异步任务的发生,文件被解析,然后根据规则系统进行处理,最后导入另一个后端数据存储。随着这些状态变化中的每一个发生,SignalR 向客户端发送消息以通知它们这些变化,从而根据文件名更新状态。为了发生这种情况,我必须将一个函数附加到在 SignalR 中收到的事件。这甚至需要对我的视图(实际上是视图模型)进行某种引用,以便它可以更新正确的值。

由于 SignalR 应该通过调用 hub.Start() 启动一次,因此我试图在“启动”阶段执行此操作。但是,当我的 SPA 启动时,该视图尚未加载,因此该视图模型也没有,因此我负责初始化 SignalR 的函数无法理解它必须更新的视图/视图模型。

我在使用 SignalR 时看到的示例显示它在一个视图中使用,但如果您需要在多个视图中使用它(您不能只继续调用 hub.start() 可以吗),那肯定不能正常工作?

抱歉,如果这仍然没有意义,我会发布一些代码或其他内容。

4

1 回答 1

9

如果你使用

$.connection.myHub.on("myMethod", function (/* ... */) { /* ... */ });

代替

$.connection.myHub.client.myMethod = function (/* ... */) { /* ... */ };

您可以在调用后添加客户端集线器方法$.connection.hub.start()

于 2013-06-13T02:57:23.313 回答