我正试图在sproutcore中找到关于数据源和相关模型的问题,而且我很快就想知道是否有人可以帮助我理解这一点。
基本上我有两个相关的模型客户端和品牌,客户可以有很多品牌和品牌可以有一个客户端,我已经正确定义了我的模型,一切都按预期拉回来。我遇到的问题是如何创建一个新的品牌并建立它的关系。 所以在我的品牌控制器上我有一个像这样的createBrand方法:
var brand = DBs.store.createRecord(DBs.Brand, {
title: this.get('title')
}, Math.floor(Math.random()*1000000));
brand.set('client', this.get('client'));
MyApp.store.commitRecords();
因此,这是一个新品牌,我随机为它生成一个新ID(createRecord的第二个参数)。这是在我的数据源中调用我的createRecord来创建新的Brand,然后它还为客户端调用updateRecord。
我遇到的问题是clientUpdate正在传递关系中的临时(随机生成的id)。我应该如何构建我的新品牌?我应该等待服务器返回新创建的品牌ID,然后更新客户关系吗?如果是这样,我该如何做呢?
由于
标记
答案 0 :(得分:2)
是的,在坐在sproutcore IRC频道并与mauritslamers交谈后,他建议创建一个框架来手动处理所有服务器交互。
所以我设置了一个名为CoreIo的框架,它包含我的所有模型,存储和数据源。 数据源仅用于从服务器获取记录,即:
fetch: function(store, query) {
var recordType = query.get('recordType'),
url = recordType.url;
if (url) {
SC.Request.getUrl(CoreIo.baseUrl+url)
.header({ 'Accept': 'application/json'})
.json()
.notify(this, '_didFetch', store, query, recordType)
.send();
return YES;
}
return NO;
},
_didFetch: function (response, store, query, recordType) {
if (SC.ok(response)) {
store.loadRecords(recordType, response.get('body'));
store.dataSourceDidFetchQuery(query);
} else {
store.dataSourceDidErrorQuery(query, response);
}
},
然后CoreIo框架为我的模型创建了方法,即:
CoreIo.createBrand = function (brand, client) {
var data = brand,
url = this.getModelUrl(CoreIo.Brand);
data.client_id = client.get('id');
SC.Request.postUrl(url)
.json()
.notify(this, this.brandDidCreate, client)
.send(data);
};
CoreIo.brandDidCreate = function (request, client) {
var json = request.get('body'),
id = json.id;
var ret = CoreIo.store.pushRetrieve(CoreIo.Brand, id, json);
var brand = CoreIo.store.find(CoreIo.Brand, id);
if (ret) {
client.get('brands').pushObject(brand);
}
};
然后我会调用这些'动作'来创建我的新模型,这也会建立关系。