2011-03-07 3 views
4

objA에서 objB 개체 속성을 적용하려고하지만 Ext.apply가 첫 번째 수준의 개체 만 함께 적용되는 방식으로 결함이 있거나 깨졌습니다.Ext.apply를 사용하여 하위/하위 객체를 다른 객체와 결합하는 더 좋은 방법이 있습니까?

예 :

var objA = { 
    name: 'objA', 
    baseParams: { 
     cols: [1,2,3,4,5] 
    } 
}; 

//used in subclass 
var objB = { 
    name: 'objB', 
    baseParams: { 
     limit: 50, 
     sort: 'name' 
    } 
}; 

//used in baseclass 
var objC = { 
    name: 'objC', 
    baseParams: { 
     as_hash: true, 
     limit: 20 
    } 
}; 

Ext.apply(objB,objA); //used in subclass 
Ext.apply(objC,objB); //used in baseclass 

예 출력됩니다 :이 출력 대신 (예상 출력)하고 싶습니다

obj = { 
    name: 'objA', 
    baseParams: { 
     cols: [1,2,3,4,5] 
    } 
}; 

는 :

obj = { 
    name: 'objA', 
    baseParams: { 
     cols: [1,2,3,4,5], 
     as_hash: true, 
     limit: 50, 
     sort: 'name' 
    } 
}; 

어떻게 일을하지 않고 달성 할 수 이?

// subclass: 
var bpTemp = {}; 
bpTemp.baseParams = Ext.apply(objB.baseParams, objA.baseParams); 
Ext.apply(objB,objA); 
Ext.apply(objB,bpTemp); 

// base class: 
var bpTemp = {}; 
bpTemp.baseParams = Ext.apply(objC.baseParams, objB.baseParams); 
Ext.apply(objC,objB); 
Ext.apply(objC,bpTemp); 
+0

흥미로운 질문, 좋은 해결책을 기대 – ChrisR

+0

감사를 찾고, 여전히하지만 대답을 찾고. – CincauHangus

답변

1

당신은 Ext.apply 방식을 변경할 수 있습니다() 제 4 인수가 될 수 있도록 작동 "깊은"적용 암시 부울 -이 귀하의 예제와 함께 작동합니다 (true로 깊은 기본값) :

Ext.apply = function(o, c, defaults, deep){ 
    deep = deep!==false; 
    // no "this" reference for friendly out of scope calls 
    if(defaults){ 
     Ext.apply(o, defaults); 
    } 
    if(o && c && typeof c == 'object'){ 
     for(var p in c){ 
      o[p] = (deep && Ext.isObject(o[p]) && Ext.isObject(c[p])) ? Ext.apply(o[p], c[p]) : c[p]; 
     } 
    } 
    return o; 
}; 
+0

FYI - 예제를 작동 시키려면 "deep"인수를 true로 기본값으로 설정합니다.하지만 Ext는 내부적으로 비 심층 적용에 의존 할 수 있으므로 앱에서 그렇게하지 않을 것입니다. 명시 적으로 "deep" 경우에 따라 –

+1

좋은 해결책이 있지만 라이브러리 기능을 사용하는 다른 사람들에게 영향을 미칠 수 있으므로 (특히 일반적으로 사용되는 방법 인 경우) 라이브러리 기능을 변경하는 것은 바람직하지 않습니다. 나는이 질문에 대답하기 때문에 대답으로 표시하고있다. – CincauHangus

+0

동의하지만 "deep"를 false로 기본값으로 설정하면이 변경은 안전 할 수 있습니다 (r) ... –

0

당신은 다음과 같이 몇 가지 특별한 경우로, 재귀 솔루션을 시도 할 수 있습니다 :

function deepApply(receiver, config, defaults) { 
    if (defaults) { 
     deepApply(receiver, defaults); 
    } 
    if (receiver && config && typeof config == 'object') { 
     for (var p in config) { 
      if (typeof config[p] != 'object' || Ext.isArray(config[p])) { 
       receiver[p] = config[p]; 
      } else { 
       if (typeof receiver[p] != 'object') { 
        receiver[p] = {}; 
       } 
       deepApply(receiver[p], config[p]); 
      } 
     } 
    } 
    return receiver; 
}