我目前正在寻找我的问题的解决方案:在我们的ASP.NET MVC应用程序中,有一些页面用于工业设备的实时数据可视化。当页面被加载时,当我从数据库中获取带有所有数据点的当前值的视图模型数据时,会显示一个加载图标。这可以很好地工作,但它是静态的,我的意思是页面上的值在加载完成后不会改变。web应用程序本身使用TCP侦听器,该侦听器从设备接收带有值的消息。这些消息(主要由设备id、数据点id和值组成)不会以固定的间隔到达,而是基于事件的,例如,当温度值向上或向下变化0.5K时。
在我的页面上,我有一些图形小部件,比如仪表和许多其他元素,它们可以正确地显示加载到页面上的初始数据的值。它们被绑定到Knockout视图模型。
问题是:每当一个新值到达服务器时,我希望在页面上显示它,而不需要重新加载。我绝对不想在到达服务器的每条消息上重新传输包含数百个数据点的整个视图模型。每秒1到15 )。为了实现这一点,我实现了SignalR框架,它工作得非常好。通过这种机制,我现在可以在客户端窗口中接收到新值(也就是说,我可以在Javascript中接收到它,并且现在有了一个如下所述的值对象)。
我现在需要的是:因为每个视图模型都是动态构建的,所以它们都是不同的。两个设备的对象和特性树不同,因此每个设备可以具有不同级别的子对象。唯一相同的是实际保存每个数据点的值的对象的结构:它总是由前面提到的设备id、数据点id和值组成。
我需要一种方法来更新视图模型中值对象中的double-type值,该对象的设备id和数据点id与新到达的值消息(也包括这两个类似地址的ID和值)相匹配。
我希望我把这个想法讲明白了。有没有办法做到这一点?这种机制的最佳实践是什么?我最近切换到Knockout-MVC (kMVC nuget包),但我也会回到“纯”Knockout.js和一些额外的脚本,如果这有帮助的话。
感谢您的帮助和建议!
发布于 2014-05-07 00:31:12
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'
});
}发布于 2015-03-05 19:55:21
当链接到DOM元素时,ViewModel属性允许进行编辑,这实际上是更新KO可观察数组中的数据。您是否可以使用您所说的一致的ID来更改“图形小部件”的值(假设它使用某些属性来保持高度和宽度)?
我还没有测试过;另一种选择是使用KO foreach循环并更新相关的值。
https://stackoverflow.com/questions/23229270
复制相似问题