Sproutcore数据源并使用关系创建新记录

时间:2011-07-04 10:45:55

标签: sproutcore

我正试图在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,然后更新客户关系吗?如果是这样,我该如何做呢?

由于

标记

1 个答案:

答案 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);
    }
};

然后我会调用这些'动作'来创建我的新模型,这也会建立关系。