шаблон загрузки данных для нокаутирования
-
27-10-2019 - |
Вопрос
Я пытаюсь понять, будет ли Knockoutjs работать для моего приложения. Моя модель данных (упрощенная) заключается в следующем:
function topic(data) {
this.id = data.id;
this.queries = ko.observableArray([]);
}
function query(data) {
this.id = data.id;
this.text = data.text;
this.searcher = data.searcherId;
this.postings = ko.observableArray([]);
}
function posting(data, query) {
this.documentId = data.docid;
this.rank = data.rank;
this.snippet = data.snippet;
this.score = data.score;
this.query = query;
this.document = null;
}
function document(data, topic) {
this.id = data.id;
this.url = data.url;
this.topic = topic;
}
Для данного topic
, У меня есть один или несколько query
экземпляры. Каждый запрос содержит список posting
экземпляры. Каждый posting
относится к документу. Больше одного posting
может обратиться к данному document
до тех пор, пока posting
экземпляры принадлежат разным query
экземпляры.
Если posting
относится к новому документу (один еще не извлечен ни одним query
) Я хотел бы создать новый экземпляр; Если document
Уже существует (идентификаторы уникальны), я хотел бы использовать его повторно.
Я вижу некоторые возможные альтернативы для структурирования данных JSON, возвращаемых сервером:
- При сериализации публикаций сначала сериализуйте список всех документов и обновите список главных документов с ними. Затем отправьте сообщения со ссылками на идентификаторы документов.
- Полностью сериализуйте каждый документ как свойство публикации, а затем выясните, является ли эта запись избыточной. Добавьте не избыточные записи в основной список.
Что является разумной схемой для сериализации данных? Есть ли какая -то плагин -плагин, которая выражает это кратко? У меня есть контроль над сервером, который генерирует JSON, и могу структурировать это любым образом, что имеет смысл.
Спасибо,
Ген
Решение
Вот что я сделал, чтобы реализовать вариант 1:
function idField(data) {
return ko.utils.unwrapObservable(data.id);
}
function createMapping(type, context) {
return {
key: idField,
create: constructor(type, context)
}
}
function constructor(type, context) {
return function(options) {
return new type(options.data, context);
}
}
function createReferenceMapping(collection) {
return {
key: idField,
create: lookup(collection)
}
}
function lookup(collectionOrClosure) {
return function(options) {
var collection = (typeof collectionOrClosure == 'function') ? collectionOrClosure() : collectionOrClosure;
var object = collection.findById(options.data.idref);
if (object == null)
console.log("Error: Could not find object with id " + options.data.idref + " in ", collection);
return object;
}
}
Я называю этот код следующим образом:
var mapping = {
people: createMapping(Searcher),
topics: createMapping(Topic, this),
activeTopic: createReferenceMapping(function(){return self.topics();})
};
this.dataChannel.loadModel(function(data) {
ko.mapping.fromJS(data, mapping, this);
}
Это позаботится об оба создании новых экземпляров (через constructor
функция) и поиск существующих через lookup
.
Другие советы
Checkout entityspaces.js, есть видео, которое вы можете посмотреть, оно поддерживает полные иерархические модели данных и даже генерирует ваш сервис WCF JSON, он также поддерживает API REST.
Структура JavaScript ORM (доступ к данным), которая использует нокаут