我目前正在寻找解决我的问题的方法:在我们的 ASP.NET MVC 应用程序中,有一些页面用于工业设备的实时数据可视化。加载页面时,会显示一个加载图标,同时我从数据库中获取具有所有数据点的当前值的 View 模型数据。这工作得很好,但它是静态的,我的意思是页面上的值在完成加载后不会改变。 Web 应用程序本身使用一个 TCP 监听器,该监听器从设备接收带有值的消息。这些消息(基本上由设备 ID、数据点 ID 和值组成)不会以固定的时间间隔到达,而是基于事件,例如当温度值向上或向下变化 0.5 K 时。
在我的页面上,我有一些图形小部件,例如仪表和许多其他元素,它们可以正确显示在页面加载时加载的初始数据的值。它们绑定(bind)到 Knockout View 模型。
问题是这样的:每当一个新值到达服务器时,我想在页面上显示它而不需要重新加载。我绝对不想在到达服务器的每条消息上重新传输带有数百个数据点的整个 View 模型(每秒大约 1 到 15 个)。为了实现这一目标,我实现了 SignalR 框架,它确实非常有效。通过这种机制,我现在可以在客户端窗口中接收到新值(这意味着,我可以在 Javascript 中接收到它,并且现在有一个如下所述的值对象)。
我现在需要的是:由于每个 View 模型都是动态构建的,因此它们都是不同的。两个设备的对象和属性树不同,因此每个设备都可以有不同级别的子对象。唯一相同的是实际保存每个数据点值的对象的结构:它始终由上述设备 ID、数据点 ID 和值组成。
我需要一种方法来更新 View 模型中值对象内的 double
类型值,其设备 ID 和数据点 ID 与新到达的值消息匹配(也由这两个类地址组成ID 和值)。
我希望我能理解这个想法。有没有办法做到这一点?这种机制的最佳做法是什么?我最近切换到 Knockout-MVC(kMVC nuget 包),但如果有帮助,我也会回到“纯”Knockout.js 和一些额外的脚本。
感谢您的帮助和建议!
最佳答案
http://nthdegree.azurewebsites.net/mvvm-2/
这是一篇针对 Knockout mapping plugin 的文章
一般的想法是你应该有你的 View 模型代码来加载你的模型。
您将绑定(bind)您的 View 模型,该 View 模型将具有您通过 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'
});
}
关于c# - 是否可以将 "inject"更新为 Knockout ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23229270/