0

(一番下に説明あり)

役立つ:コード内で先頭と末尾に (*) が付いている行は、休憩を取る行です。

カスタム Dojo ウィジェットに深刻な問題があります。

次のコード (services.aspx) があります。

    <asp:Content ID="Content2" ContentPlaceHolderID="formdojoRequirementsPlaceHolder"
    runat="Server">

    <script type="text/javascript">
        dojo.require("js.Forms.ServiceDetails");
        dojo.require("js.Forms.PendingServices");
        dojo.require("js.Forms.CertificatesList");

        dojo.addOnLoad(function() {
            //LOCALIZATION
            var glb_connections = [];
            var ServiceDetailsTab = dijit.byId('ServiceDetails');
            var PendingTaskTab = dijit.byId('PendingTask');
            var PendingServicesTab = dijit.byId('PendingServices');
            var CertificatesListTab = dijit.byId('CertificatesList');
            var MessagesTab = dijit.byId('Messages');

            if (ServiceDetailsTab) { ServiceDetailsTab.attr('title', glb_nlsStrings.ServiceTab) };
            if (PendingTaskTab) { PendingTaskTab.attr('title', glb_nlsStrings.PendingTaskTab) };
            if (PendingServicesTab) { PendingServicesTab.attr('title', glb_nlsStrings.PendingServicesTab) };
            if (CertificatesListTab) { CertificatesListTab.attr('title', glb_nlsStrings.CertificatesTab) };
            if (MessagesTab) { MessagesTab.attr('title', glb_nlsStrings.MessagesTab) };

            ServiceDetailsTab = null;
            PendingTaskTab = null;
            PendingServicesTab = null;
            CertificatesListTab = null;
            MessagesTab = null;
            //

            var queryObj = Utils.General.GetQueryStringObject(window.location.href);
            var organizationId = queryObj[Utils.General.Constants.queryParameters.ORGANIZATIONID];
            var serviceTypeCode = queryObj[Utils.General.Constants.queryParameters.SERVICETYPECODE];

            var tab = queryObj['glb_currentTab'];

            if (dojo.byId("ServiceDetailsWdj") != undefined) {
                *djtServiceDetails.serviceTypeCode = serviceTypeCode;*

                glb_connections.push(dojo.connect(djtPendingServices, "onServiceInstanceDeleted", function() {
                    *djtServiceDetails.onBack();*
                }));

                *glb_connections.push(dojo.connect(djtServiceDetails, "onServiceCompleted", function() {
                    djtPendingServices._FindIncompleteServices(serviceTypeCode, glb_site_userID, organizationId);
                }));*
            }
            else {
                removeTab("ServiceDetails")
            }

            if (dojo.byId("PendingTaskWdj") != undefined) {
                glb_subscriptions.push(dojo.subscribe("_serviceInstanceDeleted", function(child) {
                    *djtPendingServices._FindIncompleteServices(serviceTypeCode, glb_site_userID, organizationId);*
                }));

                glb_connections.push(dojo.connect(djtPendingServices, "onServiceInstanceCompleted", function() {
                    djtPendingServices._FindIncompleteServices(serviceTypeCode, glb_site_userID, organizationId);
                    if (dojo.byId("ServiceDetailsWdj") != undefined) { *djtServiceDetails.postCreate();* }
                }));

                djtPendingServices._FindIncompleteServices(serviceTypeCode, glb_site_userID, organizationId);
            }
            else {
                removeTab("PendingTask")
            }


            removeTab("dataToBeSubmittedTab");

            if (tab != undefined) {
                glb_currentTab = tab;
                var tabContainerWidget = dijit.byId('tabContainer');
                tabContainerWidget.selectChild(glb_currentTab);
            } else {
                glb_currentTab = 'ServiceDetails';
            }

            glb_subscriptions.push(dojo.subscribe("tabContainer-selectChild", function(child) {
                glb_currentTab = child.id;
            }));

        });

        function removeTab(tabId) {
            var tabContainerDijit = dijit.byId("tabContainer");
            if (tabContainerDijit) {
                var dataToBeSubmittedTabDijit = dijit.byId(tabId);
                if (dataToBeSubmittedTabDijit) {
                    tabContainerDijit.removeChild(dataToBeSubmittedTabDijit);
                }
            }
        }

        dojo.addOnUnload(function() {
            if (typeof glb_connections != "undefined")
                dojo.forEach(glb_connections, dojo.disconnect);
            if (typeof glb_subscriptions != "undefined")
                dojo.forEach(glb_subscriptions, dojo.unsubscribe);
        });
    </script>

</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="formMainContentPlaceHolder" runat="Server">
    <div id="ServiceDetails" dojotype="dijit.layout.ContentPane" title="Services" style="height: 95%">
        <div id="divServiceDetails" runat="server">
            <div dojotype="js.Forms.ServiceDetails" jsid="djtServiceDetails" id="ServiceDetailsWdj">
            </div>
        </div>
    </div>
    <div id="PendingTask" dojotype="dijit.layout.ContentPane" title="Pending Tasks" style="height: 95%">
        <div id="divPendingTask" runat="server">
            <div dojotype="js.Forms.PendingServices" jsid="djtPendingServices" id="PendingTaskWdj">
            </div>
        </div>
    </div>
    <div id="CertificatesList" dojotype="dijit.layout.ContentPane" title="Certificates"
        style="height: 95%">
        <div id="divCertificatesList" runat="server">
            <div dojotype="js.Forms.CertificatesList">
            </div>
        </div>
    </div>
</asp:Content>

The 3 files : 1.dojo.require("js.Forms.ServiceDetails");
              2.dojo.require("js.Forms.PendingServices");
              3.dojo.require("js.Forms.CertificatesList");

ウィジェットです。

ウィジェットは MVC に基づいて構築されています。

ここで重要なのは、問題が発生するビュー部分であるため、ビューのコードは次のとおりです。

dojo.provide("js.Forms.Views.ServiceDetailsView");

dojo.require("js.Forms.Controllers.ServiceDetailsController");
dojo.require("js.FormSteps.FormsList");
dojo.require("js.FormSteps.IncompleteServices");
dojo.require("BL.DataContracts.Entities.FormDefinition");
dojo.require("BL.DataContracts.Entities.ServiceFormInstance");

dojo.require("dijit._Widget");
dojo.require("dojox.dtl._DomTemplated");
dojo.require("dijit.form.Button");
dojo.require("dijit.TooltipDialog");
dojo.require("dijit.form.DropDownButton");
dojo.require("dijit.form.DateTextBox");

dojo.declare("js.Forms.Views.ServiceDetailsView", [dijit._Widget,  dojox.dtl._DomTemplated], {
connections: null,
controller: null,
widgetsInTemplate: true,
templatePath: dojo.moduleUrl("js.Forms", "Templates/ServicesList.html"),
servicesList: null,
serviceTypeCode: null,
servicesDefinitions: null,
inCompleteServices: null,
isDissolved: null,

constructor: function() {
    this.controller = new js.Forms.Controllers.ServiceDetailsController(this);
    this.nlsStrings = dojo.i18n.getLocalization("Resources", "Resources");
    var queryObj = Utils.General.GetQueryStringObject(window.location.href);
    this.isDissolved = queryObj[Utils.General.Constants.queryParameters.ISDISSOLVED];
},

**postCreate: function(args, frag) {
    this.inherited("postCreate", arguments);
    this.ConnectEvents();
    dojo.style(this.divBackButton, "display", "none");
    if ((this.isDissolved == 'false') || (this.isDissolved == undefined)) {
        this.FindServicesDefinitions();
        this.SetButtonLabels();
    }
},**

SetButtonLabels: function() {
    this.btnBackService.attr('label', this.nlsStrings.btnBack);

},

ConnectEvents: function() {
    this.connect(this.djtIncompleteServices, 'onCreateNewService', function() {
        this.showFormDefinitions();
    });

    this.connect(this.djtIncompleteServices, 'onIncompleteServiceLoad', function(serviceinstanceid, isReturned) {            
        this.djtFormsList.isReturnedService = isReturned;
        this.onFilterDefinitions(serviceinstanceid);
    });

    this.connect(this.djtIncompleteServices, 'onIncompleteServiceDeleted', function(serviceinstanceid) {
        this.onDeleteServiceInstance(serviceinstanceid);
    });

    this.connect(this.djtFormsList, 'onServiceCompleted', function() {
        this._ServiceCompleted();
    });
},

DeleteIncompleteServiceFromModel: function(serviceinstanceid) {
    this.controller.model.incompleteServicesList = dojo.filter(this.controller.model.incompleteServicesList, function(serviceinstance) { return serviceinstance.serviceinstanceid != serviceinstanceid; });
    this.showIncompleteServices(this.controller.model.incompleteServicesList);
    dojo.publish("_serviceInstanceDeleted");
},

onDeleteServiceInstance: function(serviceinstanceid) {
    this.controller.DeleteServiceInstance(serviceinstanceid);
},

FindServicesDefinitions: function() {
    this.controller.FindServices();
},

BindServicesList: function(servicesList) {
    this.servicesList = servicesList;
    this.buildRendering();

    this.ShowServicesList(this.serviceTypeCode);
},

ShowServicesList: function(serviceTypeCode) {
    //debugger;
    dojo.style(this.divServices, "display", "block");

    if (serviceTypeCode == Utils.General.Constants.serviceTypeCode.REGISTRATIONOFORGANIZATION) {
        if (glb_currentRegistrationService) {
            dojo.style(this.divServices, "display", "none");
            this.controller.FindIncompleteRegistrationServices();
        }
    }

    this.servicesListHeading.innerHTML = (serviceTypeCode == Utils.General.Constants.serviceTypeCode.CHANGEOFORGANIZATION) ?
                                         this.nlsStrings.colOrganizationChangeServices : this.nlsStrings.colOrganizationChangeServices;
},

BindIncompleteRegistrationServices: function() {
    //debugger;
    dojo.style(this.divServices, "display", "block");
    var incompleteRegistrationServices = this.controller.GetIncompleteRegistrationServices();
    var hasIncompleteRegistrationServices = (incompleteRegistrationServices != null && incompleteRegistrationServices.length > 0);

    dojo.query("a[servicecode]").forEach(function(node) {
        //debugger;
        if (hasIncompleteRegistrationServices) {
            var idx = -1;
            var nodeServiceCode = dojo.attr(node, "servicecode");

            var incompleteRegServices = dojo.filter(incompleteRegistrationServices, function(item) {
                return item.serviceCode == nodeServiceCode;
            });

            if (incompleteRegServices.length == 0) {
                dojo.attr(node, "disabled", "disabled");
            }
            else {
                for (var i = 0; i < incompleteRegistrationServices.length; i++) {
                    if (incompleteRegistrationServices[i].serviceCode == nodeServiceCode)
                        idx = i;
                }

                if (idx >= 0) {
                    if (incompleteRegistrationServices[idx].shouldEnable == false)
                        dojo.attr(node, "disabled", "disabled");
                    else
                        node.removeAttribute("disabled");
                }
            }
        }
        else {
            //There are no incomplete regisistrations for the organization name.Disable any subservices.
            if (dojo.attr(node, "servicecode") != glb_currentRegistrationService) {
                dojo.attr(node, "disabled", "disabled");
            }
        }
    });
},

onselectService: function(event) {
    var domNode = event.srcElement;

    if (!dojo.hasAttr(domNode, 'disabled')) {
        var serviceCode = dojo.attr(domNode, "serviceCode");

        this.servicesDefinitions = dojo.filter(this.servicesList.OrganizationServices, function(serviceDefinition) { return serviceDefinition.ServiceDefinitionID == serviceCode; });
        if (Utils.General.GetQueryStringObject(window.location.href).organizationid == undefined) {
            this.inCompleteServices = this.controller.FindIncompleteServices(serviceCode, 0);
        }
        else {
            this.inCompleteServices = this.controller.FindIncompleteServices(serviceCode, Utils.General.GetQueryStringObject(window.location.href).organizationid);
        }
    }
},


onFilterDefinitions: function(serviceinstanceid) {
    glb_serviceInstanceID = serviceinstanceid;
    var filteredDefitions = this.controller.FilterFormsDefinitions(serviceinstanceid);
},

DeleteServiceDefinitionFromClient: function(serviceinstanceid) {

},

showFilteredFormDefinitions: function() {
    //debugger;
    var iscomplete = true;
    var modl = this.controller.model.incompleteServiceFormsList;

    var servDefinitions = dojo.clone(this.servicesDefinitions[0]);
    var formsDef = servDefinitions.FormsDefinitions;
    var formCode = null;

    if (servDefinitions.IsVariableFee) {
        var registrationForm = dojo.filter(modl, function(item) {
            return item.formnumber == 'XI00Z';
        });
        if (registrationForm.length > 0) {
            servDefinitions.Fee = registrationForm[0].CalculatedVariableFee;
        }
    }

    for (var i = 0; i < formsDef.length; i++) {
        formCode = formsDef[i].FormDefinitionID;
        for (var j = 0; j < modl.length; j++) {
            if (modl[j].formnumber == formCode) {
                //Attach some dynamic properties to the form definitions
                formsDef[i].pendingtaskid = modl[j].pendingtaskid;
                formsDef[i].iscomplete = modl[j].iscomplete;
                formsDef[i].drcorstatus = modl[j].drcorstatus;

                if ((!modl[j].isDocument) && (modl[j].Attachments.length > 0)) {
                    formsDef[i].DocumentGuid = modl[j].Attachments[0].DocumentID;
                }

                if (modl[j].iscomplete == 0) {
                    iscomplete = false;
                }
            }
        }
    }

    this.djtFormsList.IsCompleted(iscomplete);
    this.djtFormsList.SetServiceFormsDefinitions(servDefinitions);

    for (var i = 0; i < modl.length; i++) {
        if (modl[i].isDocument) {
            //Set the attachments for each document in the incomplete service form list
            this.djtFormsList.SetDocumentAttachments(modl[i].formnumber, modl[i].Attachments);
        }
    }

    dojo.style(this.divBackButton, "display", "block");
    dojo.style(this.divServices, "display", "none");
    dojo.style(this.divServiceFormsDefinitions, "display", "block");
    dojo.style(this.divIncompleteServices, "display", "none");
},

showIncompleteServices: function(inCompleteServices) {
    this.djtIncompleteServices.SetIncompleteServicesList(inCompleteServices);
    dojo.style(this.divBackButton, "display", "block");
    dojo.style(this.divServices, "display", "none");
    dojo.style(this.divIncompleteServices, "display", "block");
},

showFormDefinitions: function() {
    this.djtFormsList.IsCompleted(false);
    glb_serviceInstanceID = 0;
    this.djtFormsList.SetServiceFormsDefinitions(this.servicesDefinitions[0]);
    this.djtFormsList.ClearDocumentAttachments();
    dojo.style(this.divBackButton, "display", "block");
    dojo.style(this.divServices, "display", "none");
    dojo.style(this.divServiceFormsDefinitions, "display", "block");
    dojo.style(this.divIncompleteServices, "display", "none");
},



onBack: function() {
    dojo.style(this.divBackButton, "display", "none");
    dojo.style(this.divServices, "display", "block");
    dojo.style(this.divServiceFormsDefinitions, "display", "none");
    dojo.style(this.divIncompleteServices, "display", "none");

    this.buildRendering();
    this.ShowServicesList(this.serviceTypeCode);
},

_ServiceCompleted: function() {
    glb_serviceInstanceID = 0;
    dojo.style(this.divBackButton, "display", "none");
    dojo.style(this.divServices, "display", "block");
    dojo.style(this.divServiceFormsDefinitions, "display", "none");
    dojo.style(this.divIncompleteServices, "display", "none");

    this.buildRendering();
    this.ShowServicesList(this.serviceTypeCode);
    this.onServiceCompleted();
},

onServiceCompleted: function() {
}
});

わかりましたので、問題を説明しましょう。

Internet Explorer 8 または 7 でこのアプリケーションを実行すると、すべてが完全に機能します。しかし、IE9、Firefox、または Chrome を使用して開こうとすると、「djtServiceDetails が定義されていません」というエラーが表示されます。

デバッグから理解したように、これは、ファイルが実行されたときにビューのpostCreate部分が実行されないためです (postCreate のデバッガーが見つからない)

上記と同じ構造を使用した同様のページがあり、すべてのブラウザーで機能しますが、違いは見つかりませんでした。

この問題の解決に役立つ何かを教えていただければ幸いです。

さらに情報が必要な場合は、お知らせください。

前もって感謝します

ソロン

4

2 に答える 2

0

マークアップの解析に問題があると思います。DOCTYPEとレンダリングエンジンはプラットフォームに依存しないJSで「防御」するのが最も難しい部分であるため、dojoを使用する場合、これは基本的に最大の警告です。私はしばらくの間<1.7を使用していませんが、カスタム属性でキャメルケース構文を使用して、適切なマークアップがこれに近いと確信しています。

<div id="ServiceDetails" dojoType="dijit.layout.ContentPane" title="Services" style="height: 95%">
    <div id="divServiceDetails" runat="server">
        <div dojoType="js.Forms.ServiceDetails" jsId="djtServiceDetails" id="ServiceDetailsWdj">
        </div>
    </div>
</div>
<div id="PendingTask" dojoType="dijit.layout.ContentPane" title="Pending Tasks" style="height: 95%">
    <div id="divPendingTask" runat="server">
        <div dojoType="js.Forms.PendingServices" jsId="djtPendingServices" id="PendingTaskWdj">
        </div>
    </div>
</div>
<div id="CertificatesList" dojoType="dijit.layout.ContentPane" title="Certificates"
    style="height: 95%">
    <div id="divCertificatesList" runat="server">
        <div dojoType="js.Forms.CertificatesList">
        </div>
    </div>
</div>

バリデーターを介してどちらの方法でも乱雑に見えます=)

繰り返しになりますが、1.6 imはわかりませんが、html5 compat属性の名前付けスキーマに置き換えることができると思います。これにより、次のようになりdojoTypeます(参照APIでこれらを調べる必要があります)。jsIdに関しては、dijitレジストリを介してウィジェットを参照するのが最善ですが、グローバルスコープの公開は将来のバージョンで終了する予定です。したがって、上記のオブジェクトを取得する代わりに、data-dojo-typejsIddata-dojo-jsId/*window.*/ djtServiceDetailsdijit.byId('djtServiceDetails')

試してみてください。そうは言っても、私は個人的に「title」、「id」、「valueAttr」などをdojoProps属性にコンパイルするので、次のようになります。

<div dojoType="dijit.layout.ContentPane" jsId="registryKeyId" title="Dia Title" href="index101.html"></div>

になります

<div dojoType="dijit.layout.ContentPane" dojoProps="id:'registryKeyId', title:'Dia Title', href:'index101.html'"></div>
于 2012-05-30T11:04:10.937 に答える
0

うまくいくかもしれないし、うまくいかないかもしれない提案があります。簡略化されたコードで問題を再現しようとしましたが、できませんでした。原則として、カスタム ウィジェットではコンストラクター関数を提供しません。コンストラクターにあるコードは、postMixInProperties.

コンストラクター関数を次のように変更してみてください。

postMixInProperties: function() {
    this.inherited(arguments);

    this.controller = new js.Forms.Controllers.ServiceDetailsController(this);
    this.nlsStrings = dojo.i18n.getLocalization("Resources", "Resources");
    var queryObj = Utils.General.GetQueryStringObject(window.location.href);
    this.isDissolved = queryObj
        [Utils.General.Constants.queryParameters.ISDISSOLVED];
},

xhr リクエストを行う可能性が高い dojo.i18n 呼び出しが、あなたが見ている動作を引き起こしているのではないかと思います。

于 2012-05-30T10:45:34.603 に答える