淘汰赛,信号器聊天应用程序错误

时间:2015-11-14 19:29:56

标签: knockout.js signals

这是我的主页:

<div class="content" data-bind="component: { name: route().page, params: route }"></div>

这是我的page1组件:

ko.components.register("page1", { require: "Scripts/App/pages/page1/page1" });

我在page1.js中有observableArray:

 self.messages = ko.observableArray();

当page1第一次加载它正常工作时,我有以下方法:

   chat.client.broadcastMessage = function (name, mes) {          
            self.messages.push(new messageSignature({ name: name, mes: mes }));         
        };

当用户添加消息时,chat.client.broadcastMessage触发和ui更新核心。 但是当用户导航到另一个页面(组件)然后返回到page1时,self.messages是空数组,但在broadcastMessage中,它有旧消息,例如:

console.log(self.messages()); // empty array
chat.client.broadcastMessage = function (name, mes) {          
    self.messages.push(new messageSignature({ name: name, mes: mes }));
    console.log(self.messages()); // Array[4]
};

ui不再更新了。如果用户再次单击添加消息,则会触发broadcastMessage但是:

  console.log(self.messages()); // empty array
    chat.client.broadcastMessage = function (name, mes) {          
        self.messages.push(new messageSignature({ name: name, mes: mes }));
        console.log(self.messages()); // Array[5]
    };

1 个答案:

答案 0 :(得分:1)

在    chat.client.broadcastMessage 是你的signalR代理对象正在配置,对吗?

这个全球状态。但是你的组件分页输入和输出是不是全局状态,因此当它第二次构建时,它会为消息获得一个新的可观察数组。

当您第一次看到它时,这似乎没有意义,除了SignalR客户端处理程序在进行服务器连接后不能真正配置。因此,在首次创建第1页(以及配置该客户端hadnler)之后,您将连接到服务器,但是一旦您连接了,您就无法连接正确设置新的客户端处理程序。所以旧的处理程序仍然存在,它引用了旧的可观察数组。

使您的可观察数组全局化,或者至少是您网页主视图模型的属性。然后将其作为参数传递给您的第1页组件。

或者使用类似ko.postbox(Knockout插件)的内容在您的页面上发布消息,以便您的SignalR客户端处理程序可以发布/广播消息,并且您的一个或多个组件可以订阅这些消息