0

sqlite DB が背後にある開発サーバーでローカルに実行されている基本的な REST API があります。私のモデルには 2 つのプロパティがあります。年号とタイトル。これらの 2 つのプロパティに基づいて、各モデルの AJAX 呼び出しを介して外部パブリック API から追加データを取得したいのですが、その追加データをローカル DB に保存したくありません。どうやってやるの?コレクションのフェッチ メソッドを上書きしますか?

再帰的な AJAX 呼び出しの改善も歓迎されます...

ありがとうございました

コード:

class window.Movie extends Backbone.Model
    initialize: ->
        @fetchData()

    fetchData: ->
        api_url = "api_url"
        api_key = "api_key"
        model   = @
        year    = model.get "year"
        title   = model.get "title"

        $.get "#{api_url}/configuration?api_key=#{api_key}", (data) ->
            model.set "base_url", data.images.base_url

            $.get "#{api_url}/search/movie?api_key=#{api_key}&query=#{title}&include_adult=false&year=#{year}", (data) ->
                q_id = data.results[0].id

                $.get "#{api_url}/movie/#{q_id}?api_key=#{api_key}", (data) ->
                    model.set "poster_path", data.poster_path

class window.Movies extends Backbone.Collection
    model: Movie
    url: "/api/movies"
4

1 に答える 1

0

あなたの質問を理解しているように、別の API からの追加データでモデルを装飾したいと考えています。最善のアプローチは、独自のバージョンの を実装することだと思いますBackbone.sync:

Backbone.sync は、モデルの読み取りまたはサーバーへの保存を試行するたびに Backbone が呼び出す関数です。デフォルトではjQuery.ajax、RESTful JSON リクエストを作成するために使用され、jqXHR を返します。WebSocket、XML トランスポート、ローカル ストレージなどの別の永続化戦略を使用するために、これをオーバーライドできます。

Backbone.sync のメソッド シグネチャは次のとおりです。sync(method, model, [options])

  • method – CRUD メソッド ( "create""read""update"、または"delete")
  • model – 保存するモデル (または読み取るコレクション)
  • options – 成功とエラーのコールバック、およびその他すべての jQuery リクエスト オプション

さらに遠く:

sync 関数は、バックボーン コレクションまたは個々のモデルに関数をBackbone.sync追加することにより、 としてグローバルに、またはより細かいレベルでオーバーライドできます。sync

デフォルトの同期ハンドラーは、次のように CRUD を REST にマップします。

  • 作成→投稿 /collection
  • 読む → GET /collection[/id]
  • 更新→PUT /collection/id
  • 削除 → 削除 /collection/id

syncしたがって、最初にデフォルトで API からデータをフェッチし、Backbone.sync次に外部 API からのデータで装飾する関数を実装できるはずです。

3 つの GET を処理するには、次のようなasyncを使用できます。

getConfig = (next) ->

  $.get "#{api_url}/configuration?api_key=#{api_key}", next

findMovie = (next) ->

  $.get "#{api_url}/search/movie?api_key=#{api_key}&query=#{title}&include_adult=false&year=#{year}", next

async.parallel [getConfig, findMovie], (err, [config, movie]) ->

  $.get "#{api_url}/movie/#{movie.results[0].id}?api_key=#{api_key}", (data) ->
    model.set "base_url", config.images.base_url
    model.set "poster_path", data.poster_path

編集:別の可能性は、別のモデル、たとえばMovieData、代わりにこの外部 API を指す URL を持つことです。ここでもバックボーンを活用するためのよりクリーンな方法かもしれません。

于 2013-10-23T12:25:31.790 に答える