2012-02-28 9 views
0

私はEmberにダイビングしています。私はバニラオブジェクトのプレーンな配列をコレクション/コントローラに渡し、正しいモデルに型キャストする方法を探しています。ここでEmberオブジェクトへのバニラオブジェクトの自動型キャスト

は、単純なコレクションビューです:

{{#collection id="prods" contentBinding="Vix.prodsController" tagName="ul"}} 
    {{content.title}} 
{{/collection}} 

は、こちらのモデルです:

Vix.Prod = Ember.Object.extend({ 
    id: null, 
    title: null 
}); 

とコントローラ:

Vix.prodsController = Ember.ArrayController.create({ 
    content: [] 
}); 

その後のは、サーバーからいくつかのJSON形式のデータを取得してみましょう。この例では、ハードコードするだけです:

var prods = [{id:"yermom1", title:"yermom 1"}, {id:"yermom2", title:"yermom 2"}] 

Vix.prodsController.set('content', prods); 

これまでのところとても良いです。私はli要素の私の単純なリストを私が期待しているようにタイトルを表示します。しかし、私は使用して、オブジェクトのいずれかのタイトルを更新したいとき:それは正しく私のVix.Prodエンバーオブジェクトにキャストされていないmethod--オブジェクトがsetを持っていないので、

Vix.prodsController.objectAt(0).set('title', 'new title') 

それは文句を言います。この代替使用

Vix.prodsController.pushObjects(prods); 

は、同じ結果を生成します。

var prods = [Vix.Prod.create({id:"yermom1", title:"yermom 1"}), {Vix.Prod.create(id:"yermom2", title:"yermom 2"})] 

自動的に私のVix.Prodエンバーオブジェクトにそれらのバニラオブジェクトをキャストタイプする方法はあります:私は明示的に私はget/set良さを取得し、新たなモデルインスタンスを作成する場合にのみですか?もしそうでなければ、本当に欲しいのは私だけですか?バックボーンでは、コレクションにmodelプロパティを設定できます。似たようなことをするために私のコントローラ上にセッターを作ることができると思います。私が欠けているものがあるかどうか疑問に思っています。ありがとう!

答えて

2

魔法はありません。私はモデルをラップするループを行うことをお勧めします。

var prods = [{id:"yermom1", title:"yermom 1"}, {id:"yermom2", title:"yermom 2"}]; 

for (var i = 0; i < prods.length; i++) { 
    prods[i] = Vix.Prod.create(prods[i]); 
} 
+0

これはもう機能していないようです。私がこれを試してみると、あなたはモデル上で「作成」と呼ぶべきではありません。代わりに、設定したい属性で 'store.createRecord'を呼び出します.' –

1

私が望むほどのエベバーを使用する場合は、ショートカットが必要です。だからここで私が今やったことがあります。

Vix.Collection = Ember.ArrayController.extend({ 

    model: null, 

    pushObject: function(obj) { 
    if (this.get('model') && obj.__proto__.constructor !== this.get('model')) { 
     obj = this.get('model').create(obj); 
    }  
    return this._super(obj); 
    }, 

    pushObjects: function(objs) { 
    if (this.get('model')) { 
     objs = this._typecastArray(objs) 
    } 
    return this._super(objs); 
    }, 

    set: function(prop, val) { 
    if (prop === 'content' && this.get('model')) { 
     val = this._typecastArray(val); 
    } 
    return this._super(prop, val); 
    }, 

    _typecastArray: function(objs) { 
    var typecasted = []; 
    objs.forEach(function(obj){ 
     if (obj.__proto__.constructor !== this.get('model')) { 
     obj = this.get('model').create(obj); 
     } 
     typecasted.push(obj); 
    }, this); 
    return typecasted; 
    } 

}) 

を今私はpushObjectpushObjects、または.set('collection', data)を呼び出すときに、コレクション・インスタンスが定義されmodel性質を持っており、オブジェクトが追加されている場合:私は、私は私のコレクション/コントローラを作成するために使用する基本コレクションクラスを作成しましたコレクションはすでにそのタイプのものではなく、キャストされます。これまでのところうまくいきましたが、私はフィードバックを歓迎します。

0

あなたはエンバー・データを見ておく必要があります。あなたのニーズに合うように思わhttps://github.com/emberjs/data

を...今日のよう

が、それはまだ生産準備ができていないのです(READMEに記載されているように)が、活発な開発のおかげで、すぐに成熟に向かって収束しています。