所以我整合了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()就可以了) ?
很抱歉,如果这仍然没有意义,我会发布一些代码或其他内容。
答案 0 :(得分:9)
如果您使用
$.connection.myHub.on("myMethod", function (/* ... */) { /* ... */ });
而不是
$.connection.myHub.client.myMethod = function (/* ... */) { /* ... */ };
您可以在调用$.connection.hub.start()
;