我正在寻找解决我的问题的方法:在我们的ASP.NET MVC应用程序中,有一些页面用于工业设备的实时数据可视化.加载页面时,会显示加载图标,同时使用数据库中所有数据点的当前值获取viewmodel数据.这很好用,但它是静态的,我的意思是在完成加载后页面上的值不会改变. Web应用程序本身使用TCP侦听器,该侦听器使用设备中的值接收消息.这些消息(基本上由设备ID,数据点id和值组成)不以固定间隔到达,而是基于事件,例如,当温度值向上或向下变化0.5 K时.
在我的页面上,我有一些图形小部件,如仪表和许多其他元素,可以正确显示在页面加载时加载的初始数据的值.它们绑定到Knockout视图模型.
问题是:每当新值到达服务器时,我想在页面上显示它而不需要重新加载.我绝对不希望在每个到达服务器的消息上重新传输整个视图模型,其中包含数百个数据点(每秒约1到15).为了实现这一点,我实现了SignalR框架,它真的很棒.使用该机制,我现在在客户端窗口中收到新值(这意味着,我在Javascript中收到它,现在有一个如下所述的值对象).
我现在需要的是:因为每个viewmodel都是动态构建的,所以它们都是不同的.两个设备的对象和属性树不同,因此每个设备都可以具有不同级别的子对象.唯一相同的是实际保存每个数据点的值的对象的结构:它总是由前面提到的设备id,数据点id和值组成.
我需要一种方法来更新viewmodel中value对象内部的double-type值,它的device id和datapoint id匹配新到达的值消息(也包含这两个类似地址的ID和值).
我希望我能得到这个想法.有没有办法做到这一点?这种机制的最佳做法是什么?我最近切换到Knockout-MVC(kMVC nuget包),但我还会回到“纯粹的”Knockout.js和一些额外的脚本,如果这有帮助的话.
感谢您的帮助和建议!
解决方法:
http://nthdegree.azurewebsites.net/mvvm-2/
这是一篇关于Knockout mapping plugin的文章
一般的想法是你应该有你的视图模型代码加载你的模型.
您可以绑定视图模型,该模型将使用ajax调用从服务器加载属性(请参阅文章底部).
然后,您只需使用结果更新模型
ko.mapping.fromJS(newData, mapping, modelToUpdate)
var mapping = {}; //define your mapping (see documentation or blog post)
function ViewModel(){
var self = this;
self.model = ko.mapping.fromJS({}, mapping);
self.hub = $.connection.myHub();
self.hub.client.updateModel = function(data){
ko.mapping.fromJS(data, mapping, self.model);
};
self.hub.start().done(function(){
//you could either make a call or have the "OnConnected" method trigger an 'updateModel'
});
}