0

JS 配列を使用してクライアント側にキャッシュされたオブジェクトの配列があります。

var scannerDictionary = new Array();            //Holds all scanners unmodified
var modifiedScannerDictionary = new Array();    //Holds all scanners with modified values

各オブジェクトのプロパティは、GUI を使用して設定/変更され、オブジェクト内で更新されます。各オブジェクトには、InputParameters (Name、Value、およびその他のメンバーを含む Parameter クラスの配列) のリストが含まれています。

GUIでご覧ください。

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

以下は、コントロールをレンダリングするために使用したコードです-

function renderControls(scannerId) {
        var currentScanner = modifiedScannerDictionary[scannerId];

        //Render Input Parameters
        $("#tblInputCriteria").find('tr:gt(5)').remove();
        for(var i=0;i<currentScanner.InputParameters.length;i++) {
            var propType = currentScanner.InputParameters[i].DataType;
            var inParName = currentScanner.InputParameters[i].Name;

            switch(propType) {
                case 0: //Number
                    var eRow1 = $("#tblInputCriteria").find('#emptyNumRow').clone();
                    $(eRow1).removeClass('hidden').attr('id', 'Row_'+currentScanner.InputParameters[i].Name);
                    $(eRow1).appendTo($('#tblInputCriteria'));
                    var prop1 = $(eRow1).find('#InNumPropName');
                    $(prop1).attr('id', 'InNumPropName_'+currentScanner.InputParameters[i].Name);
                    var propName1 = currentScanner.InputParameters[i].Name;
                    $(prop1).html(propName1);
                    var propVal1 = $(eRow1).find('#InNumPropValue');
                    $(propVal1).attr('id', 'InNumPropValue_'+currentScanner.InputParameters[i].Name);
                    $(propVal1).val(currentScanner.InputParameters[i].Value);
                    $(propVal1).blur(function () {
                        if(!ValidateNumber(this, propName1)) {
                            alert('Value should be numeric in ' + propName1);
                            setTimeout(function() {$(propVal1).focus();}, 100);
                        }else {
                            UpdateData(currentScanner.Id, propName1, $(propVal1).val());
                        }
                    });

                    break;
                case 1: //String
                    var eRow2 = $("#tblInputCriteria").find('#emptyStrRow').clone();
                    $(eRow2).removeClass('hidden').attr('id', 'Row_'+currentScanner.InputParameters[i].Name);
                    $(eRow2).appendTo($('#tblInputCriteria'));
                    var prop2 = $(eRow2).find('#InStrPropName');
                    $(prop2).attr('id', 'InStrPropName_'+currentScanner.InputParameters[i].Name);
                    var propName2 = currentScanner.InputParameters[i].Name;
                    $(prop2).html(propName2);
                    var propVal2 = $(eRow2).find('#InStrPropValue');
                    $(propVal2).attr('id', 'InStrPropValue_'+currentScanner.InputParameters[i].Name);
                    $(propVal2).val(currentScanner.InputParameters[i].Value);
                    $(propVal2).blur(function () {
                        UpdateData(currentScanner.Id, propName2, $(propVal2).val());
                    });
                    break;
                case 2: //Boolean
                    var eRow3 = $("#tblInputCriteria").find('#emptyBoolRow').clone();
                    $(eRow3).removeClass('hidden').attr('id', 'Row_'+currentScanner.InputParameters[i].Name);
                    $(eRow3).appendTo($('#tblInputCriteria'));
                    var prop3 = $(eRow3).find('#InBoolPropName');
                    $(prop3).attr('id', 'InBoolPropName_'+currentScanner.InputParameters[i].Name);
                    var propName3 = currentScanner.InputParameters[i].Name;
                    $(prop3).html(propName3);
                    var propVal3 = $(eRow3).find('#InBoolPropValue');
                    $(propVal3).attr('id', 'InBoolPropValue_'+currentScanner.InputParameters[i].Name);
                    $(propVal3).val(currentScanner.InputParameters[i].Value);
                    $(propVal3).blur(function () {
                        UpdateData(currentScanner.Id, propName3, $(propVal3).val());
                    });
                    break;
    }
}
}

問題: ここでの問題は、スイッチ内の変数が参照変数として機能することです。したがって、UpdateData()関数は同様のタイプ プロパティの最後の Name を取得します。つまり、フィールドが数値型の場合、最後のプロパティのみがUpdateData()メソッドによって更新されます。

誰でもこの問題を解決するのを手伝ってくれますか? あなたの時間と知恵を共有してくれてありがとう。

4

1 に答える 1

1

次のようなことを試してください。少しやり過ぎですが、変数の値をクロージャーにバインドします。

var fnOnBlur = (function(thePropName, thePropVal) {
    return function () {
        if(!ValidateNumber(this, thePropName)) {
            alert('Value should be numeric in ' + thePropName);
            setTimeout(function() {$(thePropVal).focus();}, 100);
        }else {
            UpdateData(currentScanner.Id, thePropName, $(thePropVal).val());
        }
    };
})(propName1, propVal1);
$(propVal1).blur( fnOnBlur );

Felik King が提供したリンクには、より詳細な議論があります。

于 2012-07-25T13:32:21.753 に答える