Как передать массив с сервера с помощью SignalR и представить результат с помощью Knockout - PullRequest
3 голосов
/ 19 марта 2012

Я играю с SignalR и KnockoutJS и, похоже, не могу найти простой способ получить массив из базы данных, представленной с использованием инфраструктуры MVC4.

У меня нет проблем с отправкой одного объекта с сервера - но когда я пытаюсь отправить массив, я застреваю.Надеюсь, кто-то с большим опытом может заметить, вероятно, очевидные ошибки, которые я делаю, и показать, как это следует делать (JavaScript не является моей сильной стороной).Насколько я понимаю, проблема заключается в отображении данных, передаваемых с сервера.Любая помощь приветствуется!

Центр SignalR (заказы - это простая таблица с Id и именем)

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>

1 Ответ

2 голосов
/ 20 марта 2012

Пара точек:

  1. Просто используйте ko.observableArray(), то есть без параметра
  2. Поместите вызов ko.applyBindings в вашей функции готовности, например, непосредственно перед тем, как вы получитеВаша ссылка на концентратор

Этого должно быть достаточно, чтобы это заработало.По крайней мере, это работает мне в этой скрипке , которую я основал на вашем коде.

Еще один момент, хотя ... вы передаете простые объекты JSON в KO (то есть внутри вашего наблюдаемого массива),Это похоже на привязку данных в C # к некоторым классам, которые не реализуют INotifyPropertyChanged.IOW привязка будет работать правильно один раз, и изменения в объектах никогда не будут отражены в пользовательском интерфейсе.Если вы хотите, чтобы SignalR передавал изменения в ваши объекты, тогда они должны иметь наблюдаемые свойства, и вам может понадобиться плагин отображения KO .

...