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

来自维基百科

在面向对象的编程语言中,mixin 是一个类,它包含来自其他类的方法的组合。这种组合如何完成取决于语言,但不是通过继承。如果一个组合包含组合类的所有方法,则相当于多重继承。

在 Ember 中,对象的实例是create使用不带参数的方法创建的,或者使用表示该类型属性的单个 hash(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'
})

另一方面crateWithMixins,允许您另一个类定义混合到单个对象实例或另一个类中。因此,假设您与SomeClass上述相同,但您不想通过子类化它extend并创建另一种类型。在这种情况下,您可以使用 aMixin来确保只有一个实例具有两个类的定义。例子:

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

但是,如果您想创建一个带有 a 的新类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(),您仅在创建新类时使用它(通过extend)。当你create现有类的实例时,你不应该调用_super().

另一件事。create我看到你正在尝试View直接。我相信,根据您的代码,您应该扩展Ember.View并让框架在适当的时候为您创建实例。如果您手动创建,您将负责其工作流程的某些部分,例如将其附加到 DOM、将其删除等。也许我没有看到全貌,但仅基于此代码,我认为您不应该打电话给create那里,然后打电话extend,然后你就可以打电话了_super()

于 2013-02-26T15:25:56.107 回答