2013-02-26 2 views
9

.create().createWithMixins()의 차이점은 무엇입니까? 이에 관한 문서를 찾을 수 없습니다. 나는 다음 didInsertElement 방법에 .create() 및 전화 this._super()를 사용하여 뷰 인스턴스를 만들 때 다음과 같은 오류가 발생하지 않습니다 :.create()와 .createWithMixins()의 차이점

Ember.Object.create가 더 이상 _super를 호출 할 메소드를 정의 지원합니다.

그러나 .create().createWithMixins()으로 바꿔도 문제가 없습니다.

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

http://jsfiddle.net/bErRT/3/ 다음은 코드 샘플 JS 바이올린입니다. Wikipedia에서

답변

22

: 객체 지향 프로그래밍 언어에서

는 믹스 인은 다른 클래스의 방법의 조합을 포함하는 클래스입니다. 그러한 의 조합은 언어에 따라 다르지만, 상속에 의한 것이 아닙니다. 조합에 결합 된 클래스의 모든 메소드가 포함되어 있으면 다중 상속과 동일한 입니다. 객체의 인스턴스에 엠버

는 인수없이 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을 사용하여 하나의 인스턴스에만 두 클래스의 해당 정의가 있음을 확인할 수 있습니다. 예 : 당신이 첫 번째 인수로 Mixin을 통과하는 Mixin, 당신이 할 수있는 extendEm.Object으로 새로운 클래스를 만들려면

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

그러나, 다음과 같이

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

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

체크 아웃 API DocumentationJSFiddle도 마찬가지입니다.

편집 : _super()에 관해서는 당신이 (extend를 통해) 새로운 클래스를 만들 때, 당신 만이 사용합니다. 기존 클래스의 create 인스턴스 인 경우 _super()으로 전화하지 않아야합니다.

또 하나. createView을 직접 보려고합니다. 나는 당신의 코드를 기반으로, 당신은 Ember.View을 확장하고 프레임 워크가 적절한 시간에 당신을 위해 인스턴스를 만들어야한다고 믿는다. 수동으로 생성하는 경우 워크 플로의 일부를 DOM에 추가하거나 제거하는 등의 작업을 담당하게됩니다.어쩌면 내가 전체 그림을 볼 수 없지만, 혼자 코드를 기반으로, 나는 당신이 대신 extend을하지이 전화 create 및 전화를해야한다고 생각하고 당신이 _super()

+0

@Joe, 감사 a를 호출 할 수 있습니다 이 정교한 설명을위한 많은. 그것은 정말로 나를 위해 매우 도움이되었다. 인스턴스 생성 중에 .super()를 사용하지 않아야한다면, 축소 된 버전을 사용하면 ember가 오류를 발생시키지 않는 이유는 무엇입니까? – phkavitha

+0

확신 할 수는 없지만 축소 된 버전에서는 몇 가지 단정을 제거 할 수 있습니다. 일반적으로 디버그/개발 버전에는 제품을 사용하기 위해 잠재적 인 문제를 식별하는 데 도움이되는 모든 어설 션이 있으므로 테스트를 완료했다고 가정합니다. – MilkyWayJoe