Вопрос

Я пытаюсь понять, будет ли 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, возвращаемых сервером:

  1. При сериализации публикаций сначала сериализуйте список всех документов и обновите список главных документов с ними. Затем отправьте сообщения со ссылками на идентификаторы документов.
  2. Полностью сериализуйте каждый документ как свойство публикации, а затем выясните, является ли эта запись избыточной. Добавьте не избыточные записи в основной список.

Что является разумной схемой для сериализации данных? Есть ли какая -то плагин -плагин, которая выражает это кратко? У меня есть контроль над сервером, который генерирует 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 (доступ к данным), которая использует нокаут

https://github.com/entityspaces/entityspaces.js#readme

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top