使用SignalR连接Knockout(对象不支持属性或方法)

时间:2014-02-17 13:19:58

标签: javascript knockout.js signalr signalr-hub

启动我的应用时,我收到以下js错误(在标有###的代码行上):

JavaScript runtime error: Object doesn't support property or method 'messages'

我以前没有淘汰赛,但我试图添加淘汰赛,因为我觉得从长远来看这将更容易维护。我怀疑,因为这是我第一次进入SignalR和Knockout,我做了一些令人眼花缭乱的事情,所以任何指针都请告诉我。 mappedMessages数据已完全填充,只是在它尝试设置self.messages时才会出现问题。淘汰赛3.0.0,SignalR 1.1.3。

完整的javascript代码如下:

$(function () {

    var messageHub = $.connection.messageHubMini;

    function init() { }


    function Message(data) {
        this.Operator = ko.observable(data.Operator);
        this.text = ko.observable(data.Text);
    }

    function MessagesViewModel() {
        // Data
        var self = this;
        self.messages = ko.observableArray([]); //### message on this line
    }

    // Add a client-side hub method that the server will call
    messageHub.client.updateMessages = function (data) {

        var mappedMessages = $.map(data, function (item) { return new Message(item) });
        self.messages(mappedMessages);
    }

    // Start the connection
    $.connection.hub.start().done(init);

    ko.applyBindings(new MessagesViewModel());
});

谢谢:)

1 个答案:

答案 0 :(得分:2)

您应该在SignalR客户端方法中使用viewModel对象。目前,您正在尝试使用名为self的变量,但该变量在该SignalR客户端方法范围内不可用。我已将您的代码更新为我认为应该解决您的问题的版本,尽可能少地进行更改。

$(function () {

    var messageHub = $.connection.messageHubMini;

    function init() { }


    function Message(data) {
        this.Operator = ko.observable(data.Operator);
        this.text = ko.observable(data.Text);
    }

    function MessagesViewModel() {
        // Data
        var self = this;
        self.messages = ko.observableArray([]); //### message on this line
    }

    var viewModel = new MessagesViewModel();

    // Add a client-side hub method that the server will call
    messageHub.client.updateMessages = function (data) {

        var mappedMessages = $.map(data, function (item) { return new Message(item) });
        viewModel.messages(mappedMessages);
    }

    // Start the connection
    $.connection.hub.start().done(init);

    ko.applyBindings(viewModel);
});