HotTowel(杜兰达真的)和SignalR初始化

时间:2013-06-09 20:43:17

标签: signalr durandal hottowel

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

问题是我有很多观点。其中一些视图我想响应SignalR消息。考虑到在调用SignalR的集线器启动方法之前必须启动SignalR事件,问题是如何进行此集成。

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

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

编辑以扩展问题

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

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

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

我在使用SignalR时看到的示例显示它在一个视图中使用,但如果您需要在多个视图中,那么这确实无法正常工作(您不能只是继续调用hub.start()就可以了) ?

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

1 个答案:

答案 0 :(得分:9)

如果您使用

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

而不是

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

您可以在调用$.connection.hub.start();

后添加客户端集线器方法