2 つの異なるウィジェット タイプに対して同じ操作を実行する 2 つの関数があります。2 つではなく 1 つのジェネリック関数を使用できるようにする実装を考え出したと思いました。アイデアは、各タイプのウィジェットをこの汎用関数に渡すというものでした。ただし、詳細に苦労しています。
コードの多くを繰り返す 2 つの関数を次に示します。
buildTemplateLookupTreeDialog: function () {
lookupTreeViewDialog.bind('loaded.jstree', function () {
var templateID = workflowDialogContent.find('#DeviceTemplateID').val();
lookupTreeViewDialog.TemplateLookupTree('setSelectedNode', '#' + templateID);
lookupTreeViewDialog.TemplateLookupTree('saveCookie');
}).TemplateLookupTree();
lookupTreeViewDialog.TemplateLookupTree('onNodeDblClick', function (template) {
if (openDialog != null) {
openDialog.TemplateLookupTree('saveCookie');
openDialog.data('result', { id: template.id, name: template.name });
openDialog.dialog('close');
}
});
},
buildComponentLookupTreeDialog: function () {
lookupTreeViewDialog.bind('loaded.jstree', function () {
var componentID = workflowDialogContent.find('#DeviceComponentID').val();
lookupTreeViewDialog.ComponentLookupTree('setSelectedNode', '#' + componentID);
lookupTreeViewDialog.ComponentLookupTree('saveCookie');
}).ComponentLookupTree();
lookupTreeViewDialog.ComponentLookupTree('onNodeDblClick', function (component) {
if (openDialog != null) {
openDialog.ComponentLookupTree('saveCookie');
openDialog.data('result', { id: component.id, name: component.name });
openDialog.dialog('close');
}
});
}
これが、一般的な実装が次のようになると私が考えたものです。
buildGenericLookupTreeDialog: function (lookupTreeWidget, title, idSelector, nameSelector) {
lookupTreeViewDialog.bind('loaded.jstree', function () {
var selectedNodeID = workflowDialogContent.find(idSelector).val();
lookupTreeViewDialog.lookupTreeWidget('setSelectedNode', '#' + selectedNodeID);
lookupTreeViewDialog.lookupTreeWidget('saveCookie');
}).lookupTreeWidget();
lookupTreeWidget('onNodeDblClick', function (node) {
if (openDialog != null) {
lookupTreeWidget('saveCookie');
openDialog.data('result', { id: node.id, name: node.name });
openDialog.dialog('close');
}
});
}
//Called like so
this.buildGenericLookupTreeDialog(TemplateLookupTree, 'Select Template', '#DeviceTemplateID', '#DeviceTemplateName');
現在、このコードはすぐにエラー --TemplateLookupTree not defined をスローします。実際にウィジェットを初期化しない限り、名前でウィジェットを参照できないようです (例: lookupTreeViewDialog.TemplateLookupTree());
buildGenericLookupTree に渡す前に TemplateLookupTree を初期化すると、関数のように lookupTreeWidget が使用されるたびにエラーが発生します。
このコードを乾かす方法について何か提案はありますか?