0

我有一个基本的 REST API 在开发服务器上本地运行,后面有一个 sqlite DB。我的模型有两个属性。年份和头衔。基于这两个属性,我想通过每个模型的 AJAX 调用从外部公共 API 获取附加数据,但不想将这些附加数据存储在我的本地数据库中。我怎样才能做到这一点?覆盖集合的 fetch 方法?

递归 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。您可以覆盖它以使用不同的持久性策略,例如 WebSockets、XML 传输或本地存储。

Backbone.sync 的方法签名是sync(method, model, [options])

  • 方法 – CRUD 方法("create""read""update""delete"
  • model - 要保存的模型(或要读取的集合)
  • options – 成功和错误回调,以及所有其他 jQuery 请求选项

更远:

通过将函数添加到 Backbone 集合或单个模型,可以全局覆盖同步函数Backbone.sync,或者在更细粒度的级别上覆盖同步函数。sync

默认同步处理程序将 CRUD 映射到 REST,如下所示:

  • 创建 → 发布 /collection
  • 阅读 → 获取 /collection[/id]
  • 更新 → 放置 /collection/id
  • 删除 → 删除 /collection/id

因此,您应该能够实现一个sync函数,该函数首先使用 default 从您的 API 获取数据Backbone.sync,然后使用来自外部 API 的数据进行装饰。

要处理这三个 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,它的 URL 指向这个外部 API。也可能是在这里利用 Backbone 的一种更清洁的方式。

于 2013-10-23T12:25:31.790 回答