Knockout js и Raven DB

В настоящее время я разрабатываю приложение на основе no-sql (используя raven db). Основным аспектом этого приложения является древовидная структура данных с множеством узлов, подузлов и так далее.

В настоящее время каждый узел или подузел представлен объектом C#. Отношения родитель-потомок создаются с набором подузлов на родительском узле, отношение только вперед.

Все это обрабатывается специальными формами в приложении Mvc с соответствующими GET и POST для каждого типа данных. Весь график хранится в формате JSON в Raven DB.

Теперь цель состоит в том, чтобы изменить часть пользовательского интерфейса с помощью KnockoutJS. Поскольку KO также работает со структурами данных json, мне было интересно, есть ли способ сделать структуру ravendb json «совместимой с нокаутом», что означает, что я могу напрямую использовать ее, не создавая структуру, специфичную для KO (для реализации наблюдаемых и т. д.) а затем создать сопоставление между ними.

Пример графа объектов:

public class NodeA
{
public string Name {get;set;}
public List<SubNode> Childs {get;set;}
}

public class SubNode
{
public string Name {get;set;}
public bool SomeBool {get;set;}
}

public class NodeB
{
public string Name {get;set;}
public int SomeInt {get;set;}
}

public class GraphToStore
{
public List<NodeA> NodeAList {get;set;}
public List<NodeB> NodeBList {get;set;}
}

Часть чтения/записи по-прежнему будет обрабатываться на стороне сервера с вызовами ajax после обновления материала в пользовательском интерфейсе. Проверка будет выполняться на стороне сервера и также будет возвращена клиенту через вызовы ajax. Моя проблема, как я уже сказал, заставить ravendb json работать с нокаутом, иначе мне придется реконструировать все это и отобразить его, а график огромен (более 50 классов).


person Matteo Mosca    schedule 01.09.2011    source источник
comment
У меня нет опыта работы с Raven DB, но если сгенерированный им JSON выглядит аналогично возвращению NewtonSoft.Json.JsonConvert.SerializeObject(Object), то, думаю, это не проблема.   -  person Major Byte    schedule 01.09.2011


Ответы (2)


Взгляните на Knockout-mapping-plugin. Он будет «автоматически» генерировать модель представления, совместимую с нокаутом, одним вызовом.

Вы бы сделали что-то вроде

var viewModel.myRavenDbData = ko.mapping.fromJSON(json data variable);
var unwrappedData = viewModel.myRavenDbData(); // need only if viewModel.myRavenDbData is an observable

После того, как вы это заработаете, поставьте точку останова после вызова для сопоставления и изучения структуры данных. Как правило, это будет выглядеть как ваша структура данных с ko.observables для фактических значений. Все узлы, необходимые для навигации, будут обычными объектами javascript.

person photo_tom    schedule 06.09.2011

Да, вы можете использовать возможности Knockouts Mapping и создавать ViewModels непосредственно из объектов модели. Но у меня два момента:

1) Я думаю, что то, что объекты хранятся в RavenDB, не имеет значения. Ваши приложения MVC извлекают объекты из RavenDB, поэтому они десериализуются из JSON, а затем передаются на вашу страницу JS через интерфейс REST, поэтому они снова сериализуются в JSON. Таким образом, вы не работаете напрямую со структурой JSON RavenDB, это стандартный объект CLR, сериализованный в JSON.

Если вы хотите работать непосредственно с Raven, вы должны подключить свое приложение непосредственно к интерфейсу Raven - и это не очень хорошая идея (но, конечно, с точки зрения производительности это должно работать отлично).

2) Я не думаю, что это хорошая идея использовать объекты вашей модели в качестве ViewModels, только с помощью подключаемого модуля нокаутного отображения.

Вскоре вам нужно будет добавить некоторую логику в модель представления. Либо для вычисления значений, которые будут отображаться в представлении, либо для добавления некоторой логики действий (сохранение/редактирование... и т.д.).

В первом случае вы можете определить свои модели представления на стороне сервера и использовать плагин сопоставления.

В последнем случае вам все равно придется писать модели представления в javascript. Я бы рекомендовал начать писать модели представления непосредственно в javascript.

Это работает лучше всего для меня.

person hoonzis    schedule 31.08.2012