#knockout.js #signalr
#knockout.js #signalr
Вопрос:
У меня возникли проблемы с проектом, и я много читал, но у меня все еще возникают проблемы с его объединением.
У меня есть система продажи билетов, которая отправляет XML-уведомления на мой сервер, который обновляет базу данных SQL Server. Я подписываюсь на изменения базы данных и пытаюсь использовать SignalR и knockoutjs, чтобы обновить представление для всех подключенных клиентов.
Основная проблема, с которой я сталкиваюсь, заключается в попытке обновить модель представления, которая содержит таблицу данных о билетах. Я не очень силен в javascript, поэтому мне трудно понять, что именно мне нужно сделать по-другому. Я знаю, что я довольно близок, но мне нужен совет.
Код позади (в отдельном классе от hub)
private void BroadcastTableData(DataTable table)
{
Clients.All.updateTableData(table);
}
JS
$(function () {
var hubProxy = $.connection.notif;
function init() {
hubProxy.server.getAllTickets().done(function (table) {
$.each(table, function () {
//I know this should populate the initial table data
});
});
}
hubProxy.client.updateTableData = function (listoftickets) {
//this should update the knockoutjs view model which should be an observable array
}
$.connection.hub.start().done(init);
});
И, наконец, разметка
<tbody data-bind="foreach: tickets">
<tr>
<td data-bind="text: Message"></td>
<td data-bind="text: Id"></td>
</tr>
</tbody>
Комментарии:
1. Я настоятельно рекомендую не сериализовать таблицы данных. Если вам нужно использовать их в серверной части, сопоставьте их с POCO в хабе перед вызовом клиентов
Ответ №1:
Я не знаком с signalr, но вы могли бы просто поместить hubproxy в свою модель:
$(function() {
ko.applyBindings(new ViewModel());
});
var ViewModel = function () {
var self = this;
var hubProxy = $.connection.notif;
self.tickets = ko.observableArray(model.tickets);
var init = function(){
hubProxy.server.getAllTickets().done(function (tickets) {
self.tickets(tickets);
});
};
hubProxy.client.updateTableData = function (tickets) {
self.tickets(tickets);
};
$.connection.hub.start().done(init);
};