教程&我发现的指南建议Ember.js模型非常以数据为中心,因为浏览器中的数据持久存储到服务器和/或模型中充满了来自服务器的数据。
更具动词中心的东西怎么样?例如,我的情况是,到目前为止,我有一个“搜索”模型,其中搜索有查询,状态(“在搜索前”,“在搜索期间”等),并且希望有一些结果。我希望搜索到“runQuery”,它会向服务器发出ajax请求,返回并使用结果填充模型,并将其状态更改为“aftersearch”。
在模型上处理此类动词的最佳方法是什么? “runQuery”应该通过ember-data进行,还是仅使用$ .ajax或类似手动触发?我是否可能以错误的方式思考模型,这应该通过控制器实现?
编辑:在阅读了一些关于REST的内容之后,我认为我想要的是POST到“控制器”资源。所以,例如:
POST:/搜索(创建搜索)
POST:/ searching / 1 / run(执行搜索1的“运行”控制器
Ember.js / ember-data是否有推荐的方式来调用这样的控制器资源?
答案 0 :(得分:3)
Ember-data非常适合使用包含各种信息字段和关系的模型对象,并由唯一ID定义。我的一半API就像ember-data所期望的那样,有一半像你描述的那样,它更多的是关于数据处理或执行计算而不是创建/检索/更新/删除具有id的数据对象。将这些计算处理为相同并为其分配id并将其保留在数据库中是没有意义的。
在我的情况下,由于我有ember-data风格的数据对象和计算功能,我使用了混合的ember-data和自定义ajax请求。我存储了由ember-data检索的关系数据,但我增加了模型以包括对计算部分的访问。
例如:
App.Event = DS.Model.extend({
name: DS.attr('string'),
items: DS.hasMany('App.Item'),
...etc...
searchData: null,
searchInEvent: function(data) {
var _this = this;
return $.ajax({
url: "/api/events/" + this.get('id') + "/search/",
dataType: 'json',
type: 'POST',
data: data
}).then(function(result){
_this.set('searchData', result);
});
}
});
App.Event
是一个普通的余烬数据模型,由路由器通过通常的ember约定加载,并且由于各种控制器需要访问搜索功能,他们可以通过searchInEvent
和{{}获取它{1}}已添加到模型中。