2016-07-05 6 views
0


モデルの既存のインスタンスをバックボーンの他のタイプの派生モデルに拡張するのに問題がありますか?バックボーンのモデルの既存のインスタンスを派生モデルのインスタンス(javaでのキャストのような)に拡張/キャスト


を私が可能ということで、バックボーンに派生モデルの他のタイプのモデルの既存のインスタンスを拡張する問題があります。その場合
が、これは、助けてください私は何をする必要があるかの例ですか?もしそうなら
が、これは私が何をする必要があるかの一例である、助けてください:

var A = Backbone.Model.extend({ 
    initialize: function(options){ 
     console.log('A initialized'); 
    }, 
    foo : function(){ 
     console.log('foo of A'); 
    } 
}); 

var B = Backbone.Model.extend({ 
    initialize: function(options){ 
     A.prototype.initialize.apply(this, [options]); 
     console.log('B initialized'); 
    }, 
    foo : function(){ 
     console.log('foo of B'); 
    }, 
    goo : function(){ 
     console.log('goo of B'); 
    } 
}); 

var ACollection = Backbone.Collection.extend({ 
    model: A 
}); 

var BCollection = Backbone.Collection.extend({ 
    model: B 
}); 

var aa = new ACollection(); 
var bb = new BCollection(); 

aa.add(new A({ 
    attr1:1, 
    attr2:2, 
    attr3:3 
})); // **A initialized** 

// later after a while 

var a = aa.at(0); 
var b = cast a to type B <---- how to do this 

bb.add(b); 

// later after a while 

console.log(bb.at(0).get('attr1')); // **1** 
b.goo(); // **goo of B** 
b.foo(); // **foo of B** 

a.set({attr1:'new1'}); 
console.log(bb.at(0).get('attr1')); // **new1** 

私はモデルのクローンを作成したくない「」、I「」は他の場所の属性を変更する可能性があるため、また、 'b'も変更されていることを確認したい(同じオブジェクト) ありがとう 'a'の属性を別の場所に変更する可能性があるため、モデル 'a'を複製したくないので、 'B' に変更(同じオブジェクト) おかげ

答えて

0

私はあなたが行うことができると思います。

var a = ACollection.at(0); 
var b = new B(a.toJSON()); // create a B instance with data from instance a? 

あなただけbbコレクションに追加したい場合は、次の

bb.create(a.toJSON()); // executes new B() internally 
+0

ありがとう@T Jが、私の望むものではありません。私は 'a'を 'b'と同じオブジェクトにします。したがって、 'a'の属性を変更すると、 'b'で定義されていても、この変更のすべてのハンドラーがトリガーされます。私の質問で以前に述べたように( 'b'は 'a'の同じ目的です)。 –

+0

@saleemdiab 'a'と' b'は同時に異なるオブジェクトと同じオブジェクトであることはできません。それは意味をなさない。 –

0

どう_.extendを使用してはどうですか?

ような何か:私はフィドルでこれを試してみた

var AModel = Backbone.Model.extend(...); 
var BModel = Backbone.Model.extend(...); 

var a = new AModel(); 

_.extend(a, BModel.prototype); 

、それは大丈夫動作するようです。

a.foo()を呼び出すと、コンソールにfoo of bが表示されます。私はすぐにイベントでそれをテストし、そのまま残っているように見えました。私が逃した副作用があるかもしれません。

+0

私が欲しかったのはちょうどいい男です。 –

+0

私の答えを受け入れるのはどうですか? :) –

関連する問題