Источники данных Sproutcore и создание новых записей с отношениями - PullRequest
1 голос
/ 04 июля 2011

Я пытаюсь разобраться в источниках данных и связанных с ними моделях в sproutcore, и я не понимаю, где быстро было интересно, может ли кто-нибудь помочь мне понять это все немного лучше.

В основном у меня есть две родственные модели: Клиент и Бренд, у Клиентов может быть много Брендов, а у Брендов может быть один Клиент, я правильно определил свои модели, и все отступает, как ожидалось. У меня проблема в том, чтобы решить, как создать новый бренд и установить его отношения. Итак, на моем контроллере Brand у меня есть метод 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();

Так как это новый бренд, я случайно генерирую для него новый идентификатор (второй аргумент для createRecord). Это вызывает мой createRecord в моем источнике данных для создания нового бренда, а затем он также вызывает updateRecord для клиента.

Проблема, с которой я столкнулся, заключается в том, что clientUpdate передается временный (случайно сгенерированный идентификатор) в отношениях. Как я должен структурировать свое создание нового бренда? Стоит ли ждать, пока сервер вернет идентификатор вновь созданных брендов, а затем обновить отношения с клиентом? Если так, как бы я поступил так?

Спасибо

Mark

1 Ответ

2 голосов
/ 05 июля 2011

Точно, посидев в IRC-канале sproutcore и поговорив с 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);
    }
};

Затем я бы вызвал эти «действия» для создания моих новых моделей, которые также установили бы отношения.

...