9

.create()とはどう違い.createWithMixins()ますか?これに関するドキュメントを見つけることができません。を使用してビュー インスタンスを作成し、メソッド.create()を呼び出すと、次のエラーがスローされます。this._super()didInsertElement

Ember.Object.create は、_super を呼び出すメソッドの定義をサポートしなくなりました。

しかし、すべてを置き換える.create()と正常に.createWithMixins()動作します。コードとサンプル js fiddle は次のとおりです。

App.SampleView = Ember.View.create({
    sampleProperty : "a",
    didInsertElement : function(){
        this._super();
        this.set("sampleProperty", "b");        
    } 
});

http://jsfiddle.net/bErRT/3/

4

1 に答える 1

23

ウィキペディアから:

オブジェクト指向プログラミング言語では、ミックスインは、他のクラスのメソッドの組み合わせを含むクラスです。このような組み合わせがどのように行われるかは言語によって異なりますが、継承によるものではありません。組み合わせに組み合わせたクラスのすべてのメソッドが含まれている場合、それは多重継承と同等です。

Ember では、オブジェクトのインスタンスは、create引数のないメソッド、またはそのタイプのプロパティを表す単一のハッシュ (kvo) を使用して作成され、自動的に入力されます。例:

var SomeClass = Ember.Object.extend({
    name: '',
    url: ''
});

// this instance will have a "name" and a "url" properties with blank values
var someInstance = SomeClass.create();

// this instance will have the same properties, but now 
// their values will be populated
var anotherInstance = SomeClass.create({
    name: 'Ember.js',
    url: 'http://emberjs.com'
})

一方、では、別のクラス定義を 1 つのオブジェクト インスタンスまたは別のクラスに混在crateWithMixinsさせることができます。したがって、上記と同じものを持っているが、それをサブクラス化して別のタイプを作成したくないとしましょう。この場合、 aを使用して、その 1 つのインスタンスだけが 2 つのクラスのその定義を持つようにすることができます。例:SomeClassextendMixin

var SomeClass = Ember.Object.extend({
    name: '',
    url: ''
});

// note that you don't extend a mixin, you only create
var SomeOtherClass = Ember.Mixin.create({
    doSomething: function() {
        console.log('doing my thing');
    }
});

// This instance will have a method called "doSomething"
var x = SomeClass.createWithMixins(SomeOtherClass, { 
    name: 'Ember.js', 
    url: 'http://emberjs.com' 
});

// this instance only has methods/properties defined in "SomeClass"
// therefore, no method called "doSomething"
var y = SomeClass.create({ 
    name: 'Google', 
    url: 'http://google.ca'
});

ただし、 を使用して新しいクラスを作成する場合は、次のように を最初の引数として渡すMixinことができます。extend Em.ObjectMixin

var AnotherClass = Ember.Object.extend(SomeOtherClass, {
    firstName: '',
    lastName: ''
});

var z = AnotherClass.create();
z.set('firstName', 'Hiro');
z.set('lastName', 'Nakamura');
z.doSomething();

API ドキュメントとこのJSFiddleを確認してください。

編集: に関しては_super()、(経由で) 新しいクラスを作成するときにのみこれを使用しますextendcreate既存のクラスのインスタンスを作成するときは、 を呼び出すべきではありません_super()

別物。私はあなたが直接しようとしcreateているのを見ます。Viewあなたのコードに基づいて、拡張Ember.Viewし、フレームワークが適切なタイミングでインスタンスを作成できるようにする必要があると思います。手動で作成する場合、DOM への追加、削除など、ワークフローの一部を担当することになります。全体像が見えないかもしれませんが、このコードだけに基づいて、そうすべきではないcreateと思います。そこに電話しextendて代わりに電話すると、電話できるようになります_super()

于 2013-02-26T15:25:56.107 に答える