私の JavaScript ライブラリ全体は、オブジェクト リテラルの名前空間で構築されています。これには、init() から一般的な関数、コントロール、検証などまでの各ページのロジックが含まれています。ページの init() 関数は、ページのボディ ID に基づいて起動されます。
私が抱えている問題は、コントロール セクションにあります。AddressEntry という名前のオブジェクト リテラルがあります。このオブジェクト リテラルには、AddressEntry ASP.NET UserControl を処理する機能が含まれています。ページ上の 1 つの AddressEntry コントロールで問題なく動作しますが、複数ある場合は、ページの最後のコントロールのみが意図したとおりに動作します。
これが私のAddressEntry オブジェクト リテラルです(関連情報に切り詰められています)。
SFAIC.ctrls.AddressEntry = {
inputs : {
city : undefined,
cityState : undefined,
hidden : {
city : undefined,
state : undefined
},
},
fn : {
root : undefined,
citySelected : function($ddl) {
var $selected = $ddl.find(":selected");
this.root.inputs.hidden.city.val($selected.val());
this.root.inputs.hidden.state.val($selected.text().split(", ")[1]);
}
},
init : function(addressId) {
var self = this,
fn = self.fn,
inputs = self.inputs,
hidden = inputs.hidden;
inputs.city = SFAIC.fn.getContentElement(addressId + "_ddlCity", SFAIC.$updatePanel);
inputs.cityState = SFAIC.fn.getContentElement(addressId + "_ddlCityStateLocked", SFAIC.$updatePanel);
hidden.city = SFAIC.fn.getContentElement(addressId + "_txtCity", SFAIC.$updatePanel);
hidden.state = SFAIC.fn.getContentElement(addressId + "_txtState", SFAIC.$updatePanel);
fn.root = this;
inputs.city.change(function() { fn.citySelected($(this)); });
inputs.cityState.change(function() { fn.citySelected($(this)); });
}
};
次に、ページ オブジェクト リテラルは次のようになります (ここでも省略されています)。
SFAIC.pages.salesProcess.Applicant = {
init : function() {
SFAIC.ctrls.AddressEntry.init("AddressGarage");
SFAIC.ctrls.AddressEntry.init("AddressMailing");
}
};
AddressMailing init がAddressGarage init をオーバーライドすることは明らかです。SFAIC.ctrls.AddressEntryオブジェクト リテラルをオブジェクト化して、ページ上にある可能性のある多くの AddressEntry UserControls を互いにオーバーライドせずに処理できるようにするにはどうすればよいですか?