ember-data适配器从cloudant RESTful API读取

时间:2013-07-10 08:40:46

标签: ember.js ember-data cloudant

cloudant RESTful API 相当简单,但与ember-data期望的方式不符。如何自定义或创建处理这些问题的适配器......

在我的具体情况中,我只想加载几个二级索引之一的记录(即 MapReduce 功能)。

此网址如下所示,其中[name]和[view]会根据用户选择或我所在的路线而改变。

https://[username].cloudant.com/[db_name]/_design/[name]/_view/[view]

查看余烬数据源似乎并不像这样轻松地定义URL 。我看了一下findQuery,它希望通过url params发送任何变量,而不是实际URL本身的一部分。

我错过了什么吗?有没有明显的方法来解决这个问题?

然后数据以完全不同的格式返回,有没有办法告诉ember这种格式是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

我有类似的问题,其中URL是动态的。我最终通过扩展DS.RESTAdapter并覆盖默认的buildURL方法来创建自己的adapater。例如:

App.MyAdapter = DS.RESTAdapter.extend({
  buildURL: function(record, suffix) {
    var username, db_name, name, view;
    // Do your magic and fill the variables
    return 'https://'+username+'.cloudant.com/'+db_name+'/_design/'+name+'/_view/'+view;
  }
});

我最后还定义了我自己的find,findAll,findQuery,createRecord,updateRecord,deleteRecord等方法,因为我必须将更多变量传递给buildURL方法。

如果返回的数据格式不同,那么您也可以通过扩展DS.JSONSerializer并定义自己的提取方法extract,extractMany等来编写自己的序列化程序。

您应该评估您的API遵循ember / data RESTAdapter所需的数据格式的程度。如果它非常不同那么使用其他组件进行通信可能会更好,比如ember-model,ember-restless,emu等,因为ember-data不是很灵活(see this blog post)。您也可以直接从路径模型挂钩编写自己的ajax查询,而无需使用ember-data或其他组件。这样做并不是很难。