これはbackbone.jsに関する非常に基本的な質問です。私はjavascript/backbone.jsの完全な初心者です。私はいくつかのチュートリアルを読んでいますが、かなり単純なタスクを行うことはできません: "データベースからエントリーのリストを取り出す"。エントリの簡単なリストを取得する
アプリケーション全体がGoogle App Engineにあります。データベースにはすでにいくつかのエントリ "words"が含まれていますが、私はFlaskを使ってエントリのJSON表現を送ります。ここで
は、私はこの作業のために使用する関数です:
@wordbook.route('/words', methods=('GET', 'POST'))
def wordlist():
return retrieve_words()
def retrieve_words():
content = json.dumps([word.to_dict() for word in Word.all()])
response = make_response(content)
response.mimetype = 'application/json'
return response
だから、私の知る限り、プログラムが作業する方法を理解し、自分の基幹アプリケーションは、Webサイトのルートになり、彼がします「/ words」URLに、JSONと呼ばれる特定の形式でデータベースからデータを取得して、アプリケーションが自由に使用できるようにしてください。
私は出力が追従しているので、URL http://localhost:8080/words
は、正しいと仮定します。
[{"word": "keyboard", "key": "ahB2b2NhYnVsYXJpdW0tYXBwcgoLEgRXb3JkGAEM", "language": "en", "nature": "noun", "usage": "Plural keyboards", "gender": ""}, {"word": "keyboard", "key": "ahB2b2NhYnVsYXJpdW0tYXBwcgoLEgRXb3JkGBoM", "language": "en", "nature": "verb", "usage": "Regular verb", "gender": ""}, {"word": " mouse", "key": "ahB2b2NhYnVsYXJpdW0tYXBwcgoLEgRXb3JkGB4M", "language": "en", "nature": "noun", "usage": "Plural mousemice", "gender": ""}, {"word": " mouse", "key": "ahB2b2NhYnVsYXJpdW0tYXBwcgoLEgRXb3JkGDIM", "language": "en", "nature": "verb", "usage": "Regular verb", "gender": ""}, {"word": " hard", "key": "ahB2b2NhYnVsYXJpdW0tYXBwcgoLEgRXb3JkGDoM", "language": "en", "nature": "adj", "usage": "Comparative harder, superlative hardest", "gender": ""}...]
ウェブサイトのルートで、私は(私が最初に非常に単純なタスクを開始したい)空白のWebページを持っています、単純なjavascriptファイル(依存関係、json2、jQuery、アンダースコア、バックボーンと一緒に)
私はjavascriptの初心者ですので、構文はPythonで実際に知っているものと比較的似ているので、私はCoffeescriptを使用しました。学習曲線はそれほど急峻ではないと思いました。ここに私のコーヒーファイルがあります:
class Word extends Backbone.Model
class WordList extends Backbone.Collection
model: Word
url: 'words'
Words = new WordList
class WordView extends Backbone.View
tagName: 'p'
render: ->
word = @model.get 'word'
$(@el).html word
@
class WordListView extends Backbone.View
el: $ 'body'
initialize: ->
_.bindAll @, 'addOne', 'addAll'
Words.bind 'add', @addOne
Words.bind 'refresh', @addAll
Words.fetch()
addOne: (word) ->
view = new WordView model: word
@.$ 'body'.append view.render().el
addAll: ->
Words.each @addOne
-> WordList = new WordListView
私がここで書いたことを要約すると、Wordと呼ばれるモデルとすべての単語を含むコレクションが作成されています。このコレクションは、JSON URLを使用してサーバーからすべてのデータを取得する必要があります。 各単語は、段落pの独自の特定のビュー(WordView)でレンダリングできます。 アプリケーションビュー(WordListView)では、単にaddアクションをaddOne関数にバインドするだけでなく、addAll関数のリフレッシュアクションをバインドします。そして、私はこの時点ですべての言葉を取得しようとします。 addOne関数は、対応する単語の新しいビューを作成し、その単語を含む新しい段落を本文に追加します。新しい単語が追加されるたびに、バインドによってaddOne関数がトリガーされ、各単語がレンダリングされます。
私は考え方が正しいかどうかは分かりません。
フェッチが機能しているように見えます(URLに「/ words」を入力した場合)。 200 OK 33ms \t jquery.min.js(行18) 成功:[オブジェクトオブジェクト]、[オブジェクトオブジェクト]、[オブジェクトオブジェクト]、[オブジェクトオブジェクト]、[オブジェクトオブジェクト]、[オブジェクトオブジェクト] しかし、何もページに表示されないので、私のコードに何かが間違っているはずです。 – Edouard
@Edouard OKですので、 'addAll'が呼び出されていますか?もしそうなら、 'Words.length'と呼ばれるのは何ですか? –
ご協力ありがとうございます。私は実際に自分のコードを書き直して、今はすべてが期待どおりに動作しています。 – Edouard