【问题标题】:HotTowel (Durandal really) and SignalR initialisationHotTowel(真的是 Durandal)和 SignalR 初始化
【发布时间】:2013-06-05 12:34:20
【问题描述】:

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

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

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

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

编辑以扩展问题

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

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

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

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

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

【问题讨论】:

  • 你能描述一下你试图解决的问题吗?你试过什么?

标签: signalr durandal hottowel


【解决方案1】:

如果你使用

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

而不是

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

调用$.connection.hub.start()后可以添加客户端的hub方法;

【讨论】:

  • 太棒了!正是我正在寻找的技术。我在谷歌上搜索了“集线器启动后的 signalR 事件”之类的东西,但出于某种原因,找不到任何描述这种替代方案的东西!谢谢halter73!
  • 不只是 Durandal 或 HotTowel,任何 SPA 应用程序都可以从中受益。我正在开发一个 Backbone、Underscore 应用程序,这解决了 SignalR 未接收推送消息的问题。
  • 我要补充一点,在开始连接之前,每个集线器至少应该有一个回调。回调是否无操作无关紧要。完成此操作后,您应该可以随意添加删除回调,即使 SignalR 连接打开也是如此。
  • @halter73 谢谢,在开始连接之前每个集线器都有一个回调解决了我的特殊问题。你有这方面的参考吗?
  • @tjrobinson 查看以下指南“如何建立连接”部分的“注意事项”:asp.net/signalr/overview/signalr-20/hubs-api/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2013-05-30
  • 2013-05-04
  • 2013-03-18
  • 1970-01-01
相关资源
最近更新 更多