ember中.create()和.createWithMixins()之间的区别
.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");
}
});
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
,可以extend
Em.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()
@Joe,谢谢很多这个详细的解释。这对我确实很有帮助。如果我们不应该在实例创建期间使用.super(),那么为什么如果我使用它的缩小版本,为什么不发生任何错误? – phkavitha 2013-02-27 06:16:32
我不确定,但缩小版本可能会删除一些断言。通常,调试/开发版本具有所有的断言,以帮助您在缩小版用于生产时识别潜在问题,因此它假定您已完成测试。 – MilkyWayJoe 2013-02-27 14:58:05