2011-07-04 7 views
1

で新しいレコードを作成するには、私がsproutcoreでデータソースおよび関連モデルのまわりで私の頭を取得しようとしていると誰もが、多分私はすべてのビットこれをよりよく理解するのに役立つことができれば、高速思っていたノーを取得しています。Sproutcoreデータソースとの関係

基本的に私は2つの関連するモデルクライアントとブランドを持って、クライアントは多くのブランドを持つことができ、ブランドは、単一のクライアントを持つことができ、私は正しく私のモデルを定義していると予想されるようにすべてが戻って引っ張っています。私が抱えている問題は、新しいブランドを作り、その関係をセットアップする方法を考え出すことです。 は、だから私のブランドのコントローラ上で、私はそうのような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を呼び出しているし、クライアントのupdateRecordも呼び出します。

私がいる問題はclientUpdateの関係で一時的(ランダムに生成されたID)を渡されていることです。新しいブランドの創造をどのように構成しなければなりませんか?サーバーが新しく作成されたブランドIDを返してからクライアント関係を更新するのを待つべきですか?もしそうなら、どうすればこのことをやりますか?

おかげ

マーク

答えて

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

を、私は、これらのアクション "に呼び出します関係を設定する新しいモデルを作成することもできます。