Hello experts,
I have an app that is working just fine with SAP Web IDE (personal edition). I deployed the application in my back-end system and, when I started testing and to my big surprise, after I tried to save an erroneous entry (wanted to see if error messages are coming as expected), I got the error "Cannot read property 'getParent' of undefined". "Undefined" refers to a message popover that I use in my base controller. Exception doesn't occur within my code but within MessagePopover-dbg.js (snapshot attached below, line in error 1209).
SAPUI5 version on Web IDE: 1.44.12
SAPUI5 version on back-end system: 1.44.23
Base controller code, along with the routine that calls the popover attached below. Under other circumstances, I would normally issue a note to SAP but, since I'm new in SAPUI5, I'm not 100% sure that I'm not missing anything. Any ideas?

/********** Base controller ***********/
sap.ui.define([
"sap/ui/core/mvc/Controller",
"sap/ui/model/json/JSONModel",
"sap/m/MessagePopover",
"sap/m/MessagePopoverItem"
], function (Controller, JSONModel, MessagePopover, MessagePopoverItem) {
"use strict";
var oMessageTemplate = new MessagePopoverItem({
type: "{type}",
title: "{title}",
description: "{description}"
});
var oMessagePopover = new MessagePopover({
id: "actionEditMessagePopover",
items: {
path: '/',
template: oMessageTemplate
}
});
var msgModel = new JSONModel("testModel");
return Controller.extend("kristal.apps.agreements.controller.BaseController", {
/**
* Convenience method for accessing the router.
* @public
* @returns {sap.ui.core.routing.Router} the router for this component
*/
getRouter : function () {
return sap.ui.core.UIComponent.getRouterFor(this);
},
/**
* Convenience method for getting the view model by name.
* @public
* @param {string} [sName] the model name
* @returns {sap.ui.model.Model} the model instance
*/
getModel : function (sName) {
return this.getView().getModel(sName);
},
/**
* Convenience method for setting the view model.
* @public
* @param {sap.ui.model.Model} oModel the model instance
* @param {string} sName the model name
* @returns {sap.ui.mvc.View} the view instance
*/
setModel : function (oModel, sName) {
return this.getView().setModel(oModel, sName);
},
/**
* Getter for the resource bundle.
* @public
* @returns {sap.ui.model.resource.ResourceModel} the resourceModel of the component
*/
getResourceBundle : function () {
return this.getOwnerComponent().getModel("i18n").getResourceBundle();
},
/**
* Event handler when the share by E-Mail button has been clicked
* @public
*/
onShareEmailPress : function () {
var oViewModel = (this.getModel("objectView") || this.getModel("worklistView"));
sap.m.URLHelper.triggerEmail(
null,
oViewModel.getProperty("/shareSendEmailSubject"),
oViewModel.getProperty("/shareSendEmailMessage")
);
},
_renderSAPMessages: function(response, sStart, oControl) {
// Extract messages
// Catch logic works when we have multiple lines, re-initializes
// next line proccessing
this.messageArray = [];
var message;
var start = sStart + 14;
var resultString = response.substring(start);
var messageStart = resultString.indexOf("code") - 1;
var messageEnd = resultString.indexOf("details") - 2;
while (messageEnd > 0) {
message = "{" + resultString.substring(messageStart, messageEnd) + "}";
message = message.replace("severity\":", "type\": ");
//message = message.replace("message\":", "description\": ");
message = message.replace("message\":", "subtitle\": ");
message = message.replace("code\":", "title\": ");
message = message.replace("error", "Error");
message = message.replace("warning", "Warning");
message = message.replace("Z666Z", "\",\"description\": \"");
try {
message = JSON.parse(message);
message.title = message.title + " " + message.subtitle;
this.messageArray.push(message);
var streamEnd = resultString.indexOf("}]}") - 1;
messageEnd += 1;
if (streamEnd < messageEnd) {
// messageEnd = 0;
start = resultString.indexOf("sap-message: {") + 14;
if (start > 0) {
resultString = resultString.substring(start);
messageStart = resultString.indexOf("code") - 1;
messageEnd = resultString.indexOf("details") - 2;
} else {
messageEnd = 0;
}
} else {
resultString = resultString.substring(messageEnd);
messageStart = resultString.indexOf("code") - 1;
if (messageStart > 0) {
messageEnd = resultString.indexOf("}");
}
else {
break;
}
}
}
catch(err) {
start = resultString.indexOf("sap-message: {") + 14;
if (start > 0) {
resultString = resultString.substring(start);
messageStart = resultString.indexOf("code") - 1;
messageEnd = resultString.indexOf("details") - 2;
} else {
messageEnd = 0;
}
}
}
msgModel.setData(this.messageArray);
oMessagePopover.setModel(msgModel);
if (this.messageArray.length > 0) {
oMessagePopover.openBy(oControl);
}
},
_checkIfBatchRequestSucceeded: function(oEvent) {
var oParams = oEvent.getParameters();
var aRequests = oEvent.getParameters().requests;
var oRequest;
if (oEvent.getParameters().response.responseText.indexOf("sap-message: {") !== null) {
return true;
}
else
{
if (oParams.success) {
if (aRequests) {
for (var i = 0; i < aRequests.length; i++) {
oRequest = oEvent.getParameters().requests[i];
if (!oRequest.success) {
return false;
}
}
}
return true;
} else {
return false;
}
}
},
_checkMessagePopoverState: function() {
if (oMessagePopover.isOpen()) {
oMessagePopover.close();
}
}
});
}
);
/*********************** call to Popover ************************/
onHeaderSave: function() {
var that = this;
var oModelUpdateDeferred = jQuery.Deferred();
var bCheckSuccess;
var oModel = this.getView().getModel();
this._checkMessagePopoverState();
// abort if the model has not been changed
if (!oModel.hasPendingChanges()) {
MessageBox.information(
this.getResourceBundle().getText("noChangesMessage"), {
id: "noChangesInfoMessageBox",
styleClass: that.getOwnerComponent().getContentDensityClass()
}
);
return;
}
oModel.attachEventOnce("batchRequestCompleted", function(oEvent) {
// Get control to display message list next to
var oControl = sap.ui.getCore().byId("application-agreements-display-component---object--objectAgreementHeaderForm");
if (that._checkIfBatchRequestSucceeded(oEvent)) {
that._renderSAPMessages(oEvent.getParameters().response.responseText,
oEvent.getParameters().response.responseText.indexOf("sap-message: {"),
oControl);
if (oEvent.getParameters().response.responseText.indexOf("sap-message: {") < 0) {
bCheckSuccess = true;
} else {
bCheckSuccess = false;
}
oModelUpdateDeferred.resolve();
}
});
oModel.submitChanges({
success: function(oData, sResponse) {
},
error: function(oError) {
jQuery.sap.log.error("oData Failure", oError);
}
});
var readyToGo = function() {
if (bCheckSuccess === true) {
this.getView().byId("saveHeaderButton").setVisible(false);
this.getView().byId("cancelHeaderButton").setVisible(false);
this.getView().byId("editHeaderButton").setVisible(true);
this._bindHeaderReadOnly();
}
};
jQuery.when(oModelUpdateDeferred).done().then( jQuery.proxy(readyToGo, this) );
}