Лучшие практики для хранения JSON в DOM - PullRequest
8 голосов
/ 23 сентября 2011

Я хочу визуализировать некоторые данные JSON, используя шаблон HTML

Я еще ничего не начал реализовывать, но я хотел бы иметь возможность "установить" значения данных из json в элемент html, который содержит шаблон для одной записи, или визуализировать некоторую коллекцию элементов, используя некоторый аргумент, который шаблон HTML для каждого элемента, но также для возможности вернуть объект JSON в том же формате, что и исходный JSON, который использовался для визуализации элемента (я хочу, чтобы мой исходный JSON содержал дополнительную информацию о поведении строки записи, без необходимости ajax-запрос, чтобы проверить, может ли пользователь что-то сделать с этой записью, и не вся ли эта информация видна в шаблоне).

Я знаю, что могу создать скрытую форму с элементом ввода для каждого свойства объекта для хранения и функцией отображения в / из JSON, но для меня это звучит излишне, и мне это не нравится, я хочу немного зажигалка "конверт".

Мне было интересно, есть ли какая-нибудь библиотека JS, которая может «сериализовать» и «десериализовать» объекты JSON в html, чтобы я мог хранить их где-то в DOM (то есть в элементе, который содержит отображение данных, но я хочу иметь возможность хранить дополнительные атрибуты, которые не нужно показывать как элементы формы)?

ОБНОВЛЕНИЕ Поскольку в первом ответе предлагалось сохранить JSON в глобальной переменной, я также подумал об этом, и мое «лучшее» умственное решение состояло в том, чтобы создать модуль JavaScript (или плагин jQuery), который бы выполнял «отображение» из JSON в html, и если невозможно сохранить значения в html, он может сохранить их во внутренней переменной, поэтому, когда я хочу «получить» данные из html-элемента, он может извлечь их из локальной копии. Я хочу знать, есть ли лучший способ для этого? Если есть какая-то библиотека, которая хранит эту информацию в переменной, но выполняет «привязку» этих данных в реальном времени с помощью html, я был бы очень рад этому.

ОБНОВЛЕНИЕ 2 Теперь это делается с помощью http://knockoutjs.com/,, больше не нужно сохранять json в DOM, нокаут автоматически выполняет отображение HTML в JSON <=>

Ответы [ 4 ]

12 голосов
/ 23 сентября 2011

Почему бы не сохранить его как задуманное природой: как объект javascript?DOM - ужасное место.

Тем не менее, в jQuery есть метод данных , который позволяет только это.

2 голосов
/ 25 сентября 2011

Я делал это и в прошлом несколькими способами.

Идея $('selector').data, вероятно, является одним из наиболее полезных методов.Мне нравится этот способ хранения данных, потому что я могу хранить данные в логической, интуитивно понятной и упорядоченной форме.

Допустим, у вас есть вызов ajax, который возвращает 3 статьи при загрузке страницы.Статьи могут содержать данные, относящиеся к заголовку, дате / времени, источнику и т. Д. Предположим также, что вы хотите показать заголовки, а при нажатии на заголовок вы хотите показать полную статью и ее детали.

Чтобы немного проиллюстрировать концепцию, скажем, мы получаем json, который выглядит примерно так:

{
    articles: [
        {
            headline: 'headline 1 text',
            article: 'article 1 text ...',
            source: 'source of the article, where it came from',
            date: 'date of the article'
        },
        {
            headline: 'headline 2 text',
            article: 'article 2 text ...',
            source: 'source of the article, where it came from',
            date: 'date of the article'
        },
        {
            headline: 'headline 3 text',
            article: 'article 3 text ...',
            source: 'source of the article, where it came from',
            date: 'date of the article'
        }
    ]
}

Из вызова ajax, подобного этому.,.

$.ajax({
    url: "news/getArticles",
    data: { count: 3, filter: "popular" }, 
    success: function(data){

        // check for successful data call
        if(data.success) {

            // iterate the retrieved data
            for(var i = 0; i < data.articles.length; i++) {
                var article = data.articles[i];

                // create the headline link with the text on the headline
                var $headline = $('<a class="headline">' + article.headline + '</a>');

                // assign the data for this article's headline to the `data` property
                // of the new headline link
                $headline.data.article = article;

                // add a click event to the headline link
                $headline.click(function() {
                    var article = $(this).data.article;

                    // do something with this article data
                });

                // add the headline to the page
                $('#headlines').append($headline);
            }
        } else {
            console.error('getHeadlines failed: ', data);
        }
    }
});

Идея заключается в том, что мы можем сохранять связанные данные в элементе dom и получать доступ / манипулировать / удалять эти данные в более позднее время, когда это необходимо.Это сокращает количество возможных дополнительных вызовов данных и эффективно кэширует данные для определенного элемента dom.

в любое время после добавления ссылки на заголовок в документ, к данным можно получить доступ через селектор jquery.Чтобы получить доступ к данным статьи для первого заголовка:

$('#headlines .headline:first()').data.article.headline
$('#headlines .headline:first()').data.article.article
$('#headlines .headline:first()').data.article.source
$('#headlines .headline:first()').data.article.date

Доступ к вашим данным через селектор и объект jquery является довольно аккуратным.

2 голосов
/ 23 сентября 2011

То есть вы хотите сохранить ссылку на данные JSON, которые создали ваш DOMFragment из шаблона?

Допустим, у вас есть функция шаблона, которая берет шаблон и данные и возвращает узел DOM.

var node = template(tmpl, json);
node.dataset.origJson = json;
node.dataset.templateName = tmpl.name;

Вы можете сохранить исходный json в наборе данных узла. Возможно, вам понадобится шим набора данных.

Также нет способа "отобразить" JSON на HTML без использования механизма шаблонов. Даже тогда вам придется хранить имя шаблона в данных json (в виде метаданных), и мне это неприятно.

0 голосов
/ 23 сентября 2011

Я не думаю, что есть какие-либо библиотеки, которые хранят json в dom.

Вы можете визуализировать HTML, используя данные из json, и сохранить копию этой переменной json в качестве глобальной переменной в javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...