2013-02-26 43 views
9

.create().createWithMixins()之间的区别是什么?我无法找到关于此的任何文档。当我在didInsertElement方法,使用.create()和呼叫this._super()然后创建视图实例,下面的错误被抛出:ember中.create()和.createWithMixins()之间的区别

Ember.Object.create不再支持定义调用 _super方法。

但是,当我用替换.createWithMixins()一切工作正常。这里是代码和样本js小提琴:

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

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

回答

22

Wikipedia来自:

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

在对象的灰烬实例将与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' 
}) 

在另一方面,crateWithMixins,让你混合其他的类定义成一个对象实例或到另一个类。假设你有上面相同的SomeClass,但你不想通过extend对它进行分类并创建另一种类型。在这种情况下,您可以使用Mixin来确保只有一个实例具有这两个类的定义。例如:

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,可以extendEm.Object,传递Mixin作为第一个参数,如下所示:

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

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

退房的API Documentation以及此JSFiddle

编辑:至于_super(),你只有当你创建一个新的类(通过extend)使用。当您现有课程的实例create时,不应致电_super()

另一件事。我看到你直接尝试create a View。我相信,根据你的代码,你应该扩展Ember.View并让框架在适当的时候为你创建实例。如果您手动创建,您将负责其工作流程的某些部分,例如将其附加到DOM,删除它等。也许我看不到全貌,但仅根据这个代码,我想你应该呼叫create那里,叫extend代替,然后你就可以调用_super()

+0

@Joe,谢谢很多这个详细的解释。这对我确实很有帮助。如果我们不应该在实例创建期间使用.super(),那么为什么如果我使用它的缩小版本,为什么不发生任何错误? – phkavitha 2013-02-27 06:16:32

+0

我不确定,但缩小版本可能会删除一些断言。通常,调试/开发版本具有所有的断言,以帮助您在缩小版用于生产时识别潜在问题,因此它假定您已完成测试。 – MilkyWayJoe 2013-02-27 14:58:05

相关问题