2009-08-03 9 views
0

フォームを自動入力するために使用しているJavascript(dojo)関数があります。アイデアはフォームフィールドIDのキーを持つJSオブジェクトとフィールドの記入方法を定義する値を渡すことです。自動フォームJSコードを合理化/改善/美化するにはどうすればよいですか?

それは動作しますが、私には少し醜いと感じます(switch文、オブジェクト構文内のオブジェクト)。 *このコードをどのように改善できますか?

/** 
* 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で書かれた通訳。パーサには大量の条件チェーンがあり、すべて可読性を高めるためにスイッチで書かれています。テストの後、/ else vs switchが見つかった場合、/ elseはスイッチよりも速く評価されます。しかし、TraceMonkeyとGoogleのV8の私の声明では今や軽量化されているかもしれない。正当化はない、ちょうど経験。私はダグラス・クロフォードの話を聞いて、それについて話していたことは確かです。 –

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 liston gmane.org)にあなたのフィードバックを投稿してください。または、それを改善できれば、貢献してください。

関連する問題