Повторно използване на приспособления Yesod в резултатите от AJAX

Пиша много прост списък със съобщения Yesod, който използва AJAX за добавяне на нови елементи от списък без презареждане на страницата (както в случай на други потребители, които променят базата данни, или самият клиент добавя елемент). Това означава, че трябва да кодирам HTML структурата на елементите на съобщението както в шаблона Halmet (когато страницата се зарежда първоначално), така и в шаблона Julius (когато се случи динамичното добавяне). Те изглеждат по следния начин:

In homepage.hamlet:

$if not $ null messages
    <ul id=#{listId}>
        $forall Entity mid message <- messages
            <li id=#{toPathPiece mid}>
                <p>#{showMarkdown $ messageText message}
                <abbr .timeago title=#{showUTCTime $ messagePosted message}>

И в homepage.julius:

function(message) {
    $('##{rawJS listId}').prepend(
        $('<li>')
        .attr('id', message.id)
        .append('<p>' + message.text + '</p>')
        .append($('<abbr class=timeago />')
                .attr('title', message.posted).timeago())
        .slideDown('slow')
    );
}

Бих искал да мога да обединя тези две представяния по някакъв начин. Нямам ли късмет или бих могъл по някакъв начин да злоупотребя с джаджи, за да генерирам HTML отговор и да попълвам код в JavaScript файл?

Note: Разбира се, разбирам, че шаблоните ще трябва да работят много по различен начин, тъй като извикването на AJAX получава своите стойности от JS обект, а не от сървъра. Това е голям шанс, но реших да видя дали някой е мислил за това преди.


person Daniel Buckmaster    schedule 16.09.2013    source източник


Отговори (1)


Мисля, че това е нещо като най-добрата практика на AJAX да изберете едно място, за да извършите изобразяването на вашия шаблон, или на сървъра, или на клиента. Yesod (в момента) е ориентиран към извършване на изобразяването на сървъра.

Това все пак може да работи с AJAX замяна на съдържанието. Вместо да получавате JSON отговор от POST, трябва да получите текстов/html отговор, който съдържа резултата от изобразяването на шаблона на сървъра със стойностите, които биха били върнати чрез JSON и след това заместване на вътрешния HTML на DOM възела, който се актуализиран.

Ако искате да поддържате както JSON, така и HTML отговори (за поддръжка на приложения на трети страни чрез API или нещо подобно), ще трябва да направите формата на отговора функция на заявката; или добавяне на ".json" или ".html" към URL адреса или включване на HTTP заглавка, която изброява конкретния тип документ, изискван от клиента.

Би било хубаво, ако Yesod предостави шаблон „jwhamlet“ или нещо, което би изобразило HTML чрез javascript, за да поддържа изобразяването на клиента, но не знам за такъв. Това обаче не означава, че няма такъв, за който да не съм запознат, така че следете за други отговори.

Ако искате да направите такова нещо, можете да опитате да промените кода на квази-кавичките на hamlet, така че вместо да разширява квази-кавичките до функция за генериране на html, да ги разширява до функция за генериране на JSON и предварително изобразен фрагмент от текст, който е шаблон в стил мустаци, така че JSON, върнат от функцията, ще осигури правилния контекст за шаблона, който да бъде изобразен по начина, по който искате.

person Levi Pearson    schedule 16.09.2013
comment
Благодаря! Обмислях да изпратя HTML и този подход вероятно има повече смисъл. Yesod вече ви позволява да поискате HTML или JSON отговори (или всякакви други) въз основа на типа заявка. - person Daniel Buckmaster; 17.09.2013