SignalR / CoffeeScript Hub回调问题

时间:2012-09-11 00:01:47

标签: knockout.js signalr signalr-hub

这很好用

class Window.AppViewModel
    message : ko.observable("")
    chatMessages : ko.observableArray()
    canSendMessage : ko.observable(false)
    Window.sHub.addMsg = (data) =>  
        @::chatMessages.push(data)

而这

class Window.AppViewModel
    constructor : ->
        @message = ko.observable("")
        @chatMessages = ko.observableArray()
        @canSendMessage = ko.observable(false)
        Window.sHub.addMsg = (data) =>  
            @chatMessages.push(data)

我的服务器端集线器接收服务器消息的结果,但它无法进行任何回调。

我在这里失踪了什么?这让我起了墙。显然,基于原型的解决方案将起作用,因为它使一切都“静止”,但我已经瘫痪了,因为我现在无法编写分离良好的代码。

有没有办法看到集线器试图调用什么? SignalR文档讨论了跟踪/记录,但从未解释过如何。

1 个答案:

答案 0 :(得分:1)

所有有线客户端事件都可以通过在hubProxy原型中的jquery.SignalR中的“On”匿名函数中添加一个小片段来找到

所以现在它看起来像这样

   on: function (eventName, callback) {
            /// <summary>Wires up a callback to be invoked when a invocation request is received from the server hub.</summary>
            /// <param name="eventName" type="String">The name of the hub event to register the callback for.</param>
            /// <param name="callback" type="Function">The callback to be invoked.</param>
            var self = this;

            // Normalize the event name to lowercase
            eventName = eventName.toLowerCase();
            console.log(eventName + " callback was registered on the client");
            $(self).bind(eventNamespace + eventName, function (e, data) {
                callback.apply(self, data);
            });
            self.subscribed = true;
            return self;
        }

并且可以很好地输出可以从服务器调用的客户端方法

另外,我了解到CreateHubProxies(通过你添加的回调反映)仅针对整个hub调用一次.Start() - 因此必须将所有方法添加到之前的 启动。

这绝对应该在github wiki上。这很有道理,但并不明显。

编辑:允许您多次调用CreateHubProxies是有意义的。人们习惯于以一种延迟分配视图模型的方式编写Knockout.js代码,直到某个事件发生 - 如果你的viewmodel有任何SignalR回调,这不是不可能的。必须预先创建所有视图模型是一个很大的问题。你甚至可以通过保留已经生成并排除它们的代理成员列表来保持它的精益。