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

我相信这是解析标记的问题。这基本上是最大的警告,使用 dojo,因为 DOCTYPE 和渲染引擎是平台独立 JS 中最难“防范”的部分。我有一段时间没有使用 < 1.7 但我相当肯定正确的标记会更接近这个,在自定义属性上使用 camelCase 语法:

<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,我不确定,但我认为您可以替换为 html5 兼容属性命名模式,这样dojoType就变成data-dojo-type并且jsId将会是data-dojo-jsId(应该在参考 api 中查看这些)。关于 jsId - 您最好通过 dijit 注册表引用小部件 - 全局范围暴露将在未来版本中退出。因此,不要让所说的对象通过/*window.*/ djtServiceDetails,而是调用dijit.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];
},

我想知道 dojo.i18n 调用(很可能会发出 xhr 请求)是否会导致您看到的行为。

于 2012-05-30T10:45:34.603 回答