0

这工作正常

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 文档讨论了跟踪/记录,但从未解释过如何。

4

1 回答 1

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() 调用一次——因此在开始之前必须将所有方法添加到 hub 代理。

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

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

于 2012-09-11T02:34:48.380 回答