Обновление HTML через JSON/AJAX

Я использовал JSON для обработки функциональности Ajax в моих приложениях направляющих с тех пор, как я слышал об этом, потому что с помощью RJS/rendering HTML "чувствовал" неправильно, потому что это нарушило MVC. Первый тяжелый AJAX проект я продолжил работать, закончился с 20-30 действиями контроллера, связанными непосредственно с определенными поведениями UI и моим кодом представления, распространенным по действиям контроллера, partials и rjs файлам. Используя JSON позволяет Вам сохранять представление определенным кодом в представлении и только говорить для просмотра АГНОСТИЧЕСКИХ/УСПОКОИТЕЛЬНЫХ действий контроллера через Ajax для получения необходимых данных.

Одна головная боль, которую я нашел от использования чистого JSON, - то, что необходимо 'представить' HTML через JS, который в случае Ajax, который должен обновить DOM-тяжелые-элементы, может быть реальной болью. Я заканчиваю со строительными нормами и правилами длинной строки как

// ...ajax 
success: function(records){
  $(records).each(function(record){
    var html = ('<div id="blah">' + record.attr +
      etc +
    ')
  })
}

где и т.д. 10-15 строк динамичного построения HTML на основе рекордных данных. Кроме того, раздражения, более серьезное отступает к этому подходу, дублирование структуры HTML (в шаблоне, и в JS).* Является там лучшей практикой для этого подхода?

(Моя мотивация для того, чтобы наконец протягиваться, для меня теперь определяют задачу с обновлением HTML, настолько сложного, это потребовало, чтобы два вложенных цикла кода Ruby представили во-первых. Дублирование этого в JavaScript кажется безумным.)

  • Одна вещь, которую я рассмотрел, загружает статические частичные файлы непосредственно из файловой системы, но это кажется слишком.
5
задан tfwright 18 January 2010 в 19:38
поделиться

4 ответа

Просто случайно нашел именно то, что искал: Jaml

0
ответ дан 14 December 2019 в 13:36
поделиться

Мне нравится идея шаблонов. По моему опыту это действительно может убирать, что грязные струнные манипуляции!

Есть много решений, например, проверить Джон Сейг (Создатель jQuery):

http://ejohn.org/blog/javascript-micro-templating/

3
ответ дан 14 December 2019 в 13:36
поделиться

Вот сценарий powershell, который создает хэш SHA256 только на байтах изображения, извлеченных с помощью LockBits. Это должно создать уникальный хэш для каждого файла, который отличается. Обратите внимание, что я не включил код итерации файла, однако это должна быть относительно простая задача заменить текущий жесткий код c :\test.bmp итератором каталога foreach. Переменная $ final содержит шестнадцатеричную последовательность ascii конечного хеша.

[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing.Imaging")
[System.Reflection.Assembly]::LoadWithPartialName("System.Security")


$bmp = [System.Drawing.Bitmap]::FromFile("c:\\test.bmp")
$rect = [System.Drawing.Rectangle]::FromLTRB(0, 0, $bmp.width, $bmp.height)
$lockmode = [System.Drawing.Imaging.ImageLockMode]::ReadOnly               
$bmpData = $bmp.LockBits($rect, $lockmode, $bmp.PixelFormat);
$dataPointer = $bmpData.Scan0;
$totalBytes = $bmpData.Stride * $bmp.Height;
$values = New-Object byte[] $totalBytes
[System.Runtime.InteropServices.Marshal]::Copy($dataPointer, $values, 0, $totalBytes);                
$bmp.UnlockBits($bmpData);

$sha = new-object System.Security.Cryptography.SHA256Managed
$hash = $sha.ComputeHash($values);
$final = [System.BitConverter]::ToString($hash).Replace("-", "");

Возможно, эквивалентный код C # также поможет вам понять:

private static String ImageDataHash(FileInfo imgFile)
{
    using (Bitmap bmp = (Bitmap)Bitmap.FromFile(imgFile.FullName))
    {                
        BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
        IntPtr dataPointer = bmpData.Scan0;
        int totalBytes = bmpData.Stride * bmp.Height;
        byte[] values = new byte[totalBytes];                
        System.Runtime.InteropServices.Marshal.Copy(dataPointer, values, 0, totalBytes);                
        bmp.UnlockBits(bmpData);
        SHA256 sha = new SHA256Managed();
        byte[] hash = sha.ComputeHash(values);
        return BitConverter.ToString(hash).Replace("-", "");                
    }
}
-121--3113871-

Это, вероятно, скорее не тема, но в Ruby 1.9, вы можете сделать это:

 require 'mathn'
 38749711234868463.prime?
 => false
-121--1521034-

Я бы пошел с созданием структуры HTML, которая содержит местозаполнители для Размер применяемой структуры будет зависеть от того, что вы обновляете; Если вы знаете, сколько элементов вы будете иметь раньше времени, это будет что-то на эффект

<div id="article1">
    <div id="article1Headline"></div>
    <div id="article1Copy"></div>
    <div id="article1AuthorInfo"></div>
</div>
<div id="article2">
    <div id="article2Headline"></div>
    <div id="article2Copy"></div>
    <div id="article2AuthorInfo"></div>
</div>

Затем вы пишете код, который ссылается на идентификатор каждого элемента непосредственно, и вставляет в свойство .innerHTML (или любой синтаксически более сладкий способ jquery имеет делать то же самое). IMHO, это на самом деле не так ужасно, что нужно назначать содержимое каждого элемента, часть, которую не нужно разбрызгивать через свои функции AJAX, это сама структура HTML; в вашем приложении содержимое в любом случае изменчиво.

Однако, похоже, что у вас может быть список неизвестного количества элементов, в этом случае может потребоваться просто поместить местозаполнитель:

<div id="articleList"></div>

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

function addArticle( headline, copy, authorInfo, i ){
    createDiv( "article" + i + "Headline", headline );
    createDiv( "article" + i + "Copy", copy);
    createDiv( "article" + i + "AuthorInfo", authorInfo );
}

(не рабочий код, конечно, но вы получаете идею,)

2
ответ дан 14 December 2019 в 13:36
поделиться

Вы можете использовать функцию нагрузки в jQuery; Это загружает содержимое страницы в такую ​​то, как это:

$('#content').load("content/" + this.href.split('#')[1] + ".html", '', checkResponse);

Просто сделайте динамический вид, и вы хороши, чтобы пойти ...

1
ответ дан 14 December 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: