这是我的主页:
<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]
};
答案 0 :(得分:1)
在 chat.client.broadcastMessage 是你的signalR代理对象正在配置,对吗?
这个全球状态。但是你的组件分页输入和输出是不是全局状态,因此当它第二次构建时,它会为消息获得一个新的可观察数组。
当您第一次看到它时,这似乎没有意义,除了SignalR客户端处理程序在进行服务器连接后不能真正配置。因此,在首次创建第1页(以及配置该客户端hadnler)之后,您将连接到服务器,但是一旦您连接了,您就无法连接正确设置新的客户端处理程序。所以旧的处理程序仍然存在,它引用了旧的可观察数组。
使您的可观察数组全局化,或者至少是您网页主视图模型的属性。然后将其作为参数传递给您的第1页组件。
或者使用类似ko.postbox(Knockout插件)的内容在您的页面上发布消息,以便您的SignalR客户端处理程序可以发布/广播消息,并且您的一个或多个组件可以订阅这些消息