如何使用SignalR从服务器传递数组,并使用Knockout显示结果
How to pass an array from a server with SignalR and present the result using Knockout
我正在玩SignalR和KnockoutJS,似乎找不到从使用MVC4框架的数据库中获取数组的简单方法。
我从服务器发送一个对象没有问题,但当我试图发送一个数组时,我会被卡住。希望有更多经验的人能发现我可能犯的明显错误,并展示如何做到这一点(JavaScript不是我的强项)。据我所知,问题在于从服务器传递的数据的映射。非常感谢您的帮助!
SignalR Hub(订单是一个带有Id和Name的简单表格)
public class feedHub : Hub
{
private dataContext db = new dataContext();
public void GetAll()
{
var orders = db.orders.ToArray();
Clients.getData(orders);
}
}
显示订单的简单HTML代码;
<div id="Demo">
<div data-bind="foreach: orders">
<div data-bind="html: Id"></div>
<div data-bind="html: Name"></div>
</div>
</div>
JavaScript
<script type="text/javascript">
var viewModel = {
orders: ko.observableArray(orders)
};
ko.applyBindings(viewModel, $("#Demo")[0]);
$(function () {
// Client side version of the feebHub class
var hubcon = $.connection.feedHub;
// getData called from server
hubcon.getData = function (data) { viewModel.orders(data) };
// Start connection and call getAll
$.connection.hub.start(function () { hubcon.getAll(); });
});
</script>
几个要点:
- 只需使用
ko.observableArray()
,即不使用参数 - 将对
ko.applyBindings
的调用放在就绪函数中,例如,在获得集线器引用之前
这应该足以让它发挥作用。至少,它在我基于你的代码的小提琴中工作。
还有一点。。。您正在将纯JSON对象传递给KO(即在您的可观察数组内)。这类似于C#中针对某些类的数据绑定,这些类不实现INotifyPropertyChanged。IOW绑定将正常工作一次,对象中的更改将永远不会反映在UI上。如果你想让SignalR为你的对象提供更改,那么它们需要有可观察的属性,你可能需要研究KO映射插件。
相关文章:
- 奇怪的Javascript结果
- Javascript(jQuery)给了我奇怪的结果
- JSONP请求返回结果,但也触发error_callback
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- Javascript,输出结果后页面不断刷新
- 这是使用html快照和谷歌获取的预期结果吗?SEO/SPA
- 将地理编码结果转换为php变量以发布到mysql数据库
- AngularJS/HTML/Bootstrap元素用于动态搜索结果
- 无法获取属性'Id'使用Knockout.js的未定义或空引用API
- JQuery:向多个匹配结果添加换行符的最简单方法
- 当查询不在displayField中时,引导Ajax Typeahead不显示结果
- webpack代码拆分了handlerbs文件——结果是文件很大
- JavaScript循环无法正确计算/显示结果
- 相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null
- 如何将Knockout.JS与服务器已经在DOM中呈现的数据同步
- 显示模块模式在Knockout中设置模型的新实例
- 如何使用SignalR从服务器传递数组,并使用Knockout显示结果
- Knockout js的可见数据绑定属性不显示结果
- 将javascript变量(从knockout.js)发送到PHP并返回结果
- 使knockout侦听非击键结果的值更改