2009-08-03 3 views
0

폼을 자동으로 채우는 데 사용하는 Javascript (dojo) 함수가 있습니다. 아이디어는 양식 필드 ID에 대한 키와 필드를 채우는 방법을 정의하는 데 도움이되는 값이있는 JS 객체를 전달하는 것입니다.자동 폼 JS 코드를 간소화/개선/미화하는 방법은 무엇입니까?

작동하지만 스위치 문, 개체 구문 내에서 개체가 나에게 약간 못 생겼다고 느낍니다. 이 코드를 어떻게 향상시킬 수 있습니까?

/** 
* Fill in the form with passed in values 
* 
* @param {Object} defaults 
* 
* Can be used to pass in default values to the form. Expects an object like this: 
*  {<field id>: {type: '<field type>', value:'<value>'} 
* 
*  for example: 
*  { 
*  paymethod: {type: 'select', value:'Account Transfer'}, // html select 
*  fundsource: {type: 'combo', value:'Corporation Account'} // dijit.comboBox 
*  } 
*/ 
function fillDefaults(defaults) { 
    var props; 
    for (var field in defaults) { 
     props = defaults[field]; 
     switch (props['type']) { 
      // so far only select and combo have been implemented 
      // others will be added as needed 
      // and maybe grouped depending on how they work 
      // (e.g. all dijits together, <input> with <select>, etc.) 
      case 'select': 
       dojo.byId(field).value = props['value']; 
       dojo.byId(field).onchange() 
       break; 
      case 'combo': 
       dijit.byId(field).attr('value', props['value']); 
       break; 
     } 
    } 
} 

[*] 개선 : 예쁘게 만들어, 더 JS와 같은 더 많은 도장과 같은,보다 간소화 된

답변

1

꽤 무엇을 의미합니까? js와 같은 무엇입니까?

더 많은 개체로 확장하려는 경우 메모리 집중 형이지만 스위치가 더 깨끗합니다.

funcs = { 
    select: function(value) { 
    dojo.byId(field).value = value; 
    dojo.byId(field).onchange() 
    }, 
    combo: function(value) { 
    dijit.byId(field).attr('value', value); 
    } 
}; 

function payFillDefaults(defaults) { 
    var props; 
    for(var field in defaults) { 
    props = defaults[field]; 
    if(funcs[props['type']]) { 
     funcs[props['type']](props['value']); 
    } 
    } 
} 
+2

스위치는 메모리를 많이 사용합니까? 그 진술을 정당화 할 수 있습니까? – Josh

+0

작년에 우리는 A.I. JS로 작성된 통역사. 구문 분석기에는 가독성을 높이기 위해 스위치로 작성된 대규모 조건 체인이 있습니다. 테스트를 마친 후/vs 스위치를 찾으면/else가 스위치보다 빠르게 평가됩니다. 그러나 TraceMonkey와 Google의 V8 내 명세서가 이제는 무게가 줄어들 수 있습니다. 칭의는없고, 단지 경험. 더글러스 크로프트 (Douglas Crockford)의 이야기를 듣고 비디오 클립을 보았다고 확신합니다. –

0

개선 조금 따라 JSLint 기준 : 어쩌면

대신 스위치의 객체는 당신의 기능을 포함해야

function fillDefaults(defaults) { 
    var props, field; 
    for (field in defaults) { 
     props = defaults[field]; 
     switch (props.type) { 
     case 'select': 
      dojo.byId(field).value = props.value; 
      dojo.byId(field).onchange(); 
      break; 
     case 'combo': 
      dijit.byId(field).attr('value', props.value); 
      break; 
     } 
    } 
} 
0

이 약 않습니다 dojox.form.manager —에서보세요 무엇을 성취하고 싶다. 이는 기존 양식 위젯 ("main" mixin), 실질적으로 모든 DOM 양식 요소 (node mixin), 통합 이벤트 처리 등을 지원합니다. 그것은 수정되지 않은 형태로 사용될 수 있습니다.

아마도 이미 추측했듯이 필요한 기능 만 선택할 수 있도록 독립적 인 믹스 인 세트로 구성되어 있습니다. 편의상 예를 들어 모든 믹스 인을 함께 결합하는 클래스가 있습니다 : Manager.

그것이하는 일을 읽고 필요에 맞는 지 확인하십시오. 아니라면 코드를 연구하고 좋아하는 것을 빌리십시오. 누락 된 경우 —은 the mailing list (on gmane.org)에 대한 귀하의 의견을 공유합니다. 또는 개선 할 수 있다면 다시 기여하십시오.

관련 문제