2013-01-01 3 views
8

Ich habe eine RouteJessod, Howto typsichere Verbindung von JSON-Daten in Javascript/Julius

/notes/#NoteId NoteR GET 

Von einer anderen Seite erzeugen, möchte ich es verbinden. Als „klassische“ Weiler verwenden, ist es einfach:

<a [email protected]{NoteR $ entityKey note}>notetitle 

ich meine Seite sein wollen dynamischer und bekommen JSON-Daten, die die Notiz-Informationen enthält und Note-ID. Wie erzeuge ich korrekte und typesafe-Links?

Ich habe bereits diesen Code in einer .julius Datei, aber es kompiliert nicht, weil es eine "NoteId" erwartet. Ich sollte irgendwo in die URL-Interpolation einfügen @ {..} ... Irgendwelche Hinweise, wie man das macht?

function loadnotes() { 
var list = $("#results"); 
jQuery.getJSON("@{NotesR}", 
    function(o){ 
     $.each(o, function (i, obj) { 
      $('<a [email protected]{NoteR}/>' + obj.title + '</a>').appendTo(list); 
     })}); 
} 
window.onload = loadnotes; 

EDIT:

Ich habe dies in Model.hs:

instance ToJSON (Entity Note) where 
    toJSON (Entity nid (Note title content created_at updated_at userId)) = object 
     [ "id" .= nid 
     , "title" .= title 
     , "content" .= (unTextarea content) 
     , "created_at" .= created_at 
     , "updated_at" .= updated_at 
     , "userId" .= userId ] 
+0

ich mit Javascript nicht gut bin, aber wie ich es sehe, ist der 'note' Wert im Weiler Beispiel ein typisierte Haskell-Wert. Aber "obj" im Julius-Code ist ein untypisiertes JavaScript-Objekt. Wäre es sinnvoll, wenn etwas ohne einen bekannten Typ Teil einer typsicheren URL wäre? – Tarrasch

Antwort

6

ich die NotesR Route die vollständig gerenderte URL statt nur die Note ID zurückkehren zu müssen empfehlen würde.

bearbeiten: Ich habe einen Kochbuch-Eintrag hinzugefügt, diesen Ansatz zu demonstrieren: https://github.com/yesodweb/yesod/wiki/Using-type-safe-urls-from-inside-javascript

+0

Ich verstehe deine Antwort ... aber wie? Ich hatte die Instanz von ToJSON für die Entity Note (siehe Edit in Frage) in 'Model.hs'. Ist das der empfohlene Ort? Beim Hinzufügen einer Zeile für die URL, mit 'NoteR nid', erhalte ich den Fehler, dass der Datenkonstruktor nicht im Geltungsbereich ist ... Wenn dieser Code in die Handler-Datei verschoben wird, gibt es einen weiteren Fehler. Was wird empfohlen? – davidbe

+0

Ich habe ein Kochbuchbeispiel hinzugefügt, das hoffentlich den Ansatz zeigt. Lassen Sie mich wissen, wenn Sie weitere Fragen haben: https://github.com/yesodweb/yesod/wiki/Using-type-safe-urls-from-inside-javascript –

+0

Vielen Dank. Das hat alles geklärt! Ich hatte Probleme mit der richtigen URL. Ich fing von diesem Beispiel an: http://www.yesodweb.com/blog/2012/04/yesod-js-todo (json innerhalb des Handlers nicht erzeugend). Das Generieren von Json aus dem internen Handler macht mehr Sinn, wenn die richtige URL benötigt wird. – davidbe