В настоящее время я разрабатываю приложение на основе 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 классов).
Ответ 1 · рейтинг 4 · photo_tom
Взгляните на 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.
Ответ 2 · hoonzis
Да, вы можете использовать возможности Knockouts Mapping и создавать ViewModels непосредственно из объектов модели. Но у меня два момента:
1) Я думаю, что то, что объекты хранятся в RavenDB, не имеет значения. Ваши приложения MVC извлекают объекты из RavenDB, поэтому они десериализуются из JSON, а затем передаются на вашу страницу JS через интерфейс REST, поэтому они снова сериализуются в JSON. Таким образом, вы не работаете напрямую со структурой JSON RavenDB, это стандартный объект CLR, сериализованный в JSON.
Если вы хотите работать непосредственно с Raven, вы должны подключить свое приложение непосредственно к интерфейсу Raven - и это не очень хорошая идея (но, конечно, с точки зрения производительности это должно работать отлично).
2) Я не думаю, что это хорошая идея использовать объекты вашей модели в качестве ViewModels, только с помощью подключаемого модуля нокаутного отображения.
Вскоре вам нужно будет добавить некоторую логику в модель представления. Либо для вычисления значений, которые будут отображаться в представлении, либо для добавления некоторой логики действий (сохранение/редактирование... и т.д.).
В первом случае вы можете определить свои модели представления на стороне сервера и использовать плагин сопоставления.
В последнем случае вам все равно придется писать модели представления в javascript. Я бы рекомендовал начать писать модели представления непосредственно в javascript.
Это работает лучше всего для меня.