SharePoint App Part TypeError: SP.SOD is undefined
-
15-01-2021 - |
Pregunta
Visual Studio generates some code when you create a new add-in. I want to develop a app part which shows the current user. I added a new web-part in Visual Studio and modified the code from App.js
and from Pages/AppPart.aspx
.
App.js
'use strict';
$(document).ready(function () {
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', initializePage);
});
function initializePage() {
var context = SP.ClientContext.get_current();
var user = context.get_web().get_currentUser();
// This code runs when the DOM is ready and creates a context object which is needed to use the SharePoint object model
$(document).ready(function () {
getUserName();
});
// This function prepares, loads, and then executes a SharePoint query to get the current users information
function getUserName() {
context.load(user);
context.executeQueryAsync(onGetUserNameSuccess, onGetUserNameFail);
}
// This function is executed if the above call is successful
// It replaces the contents of the 'message' element with the user name
function onGetUserNameSuccess() {
$('#message').text('Hello ' + user.get_title());
}
// This function is executed if the above call fails
function onGetUserNameFail(sender, args) {
alert('Failed to get user name. Error:' + args.get_message());
}
}
Here I've replaced the call ExecuteOrDelayUntilScriptLoaded
with SP.SOD.executeFunc
, because this thread said it could be a solution.
Pages/AppPart.aspx
<%@ Page Language="C#" Inherits="Microsoft.SharePoint.WebPartPages.WebPartPage, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<WebPartPages:AllowFraming ID="AllowFraming" runat="server" />
<html>
<head>
<title></title>
<script type="text/javascript" src="../Scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="/_layouts/15/MicrosoftAjax.js"></script>
<script type="text/javascript" src="/_layouts/15/sp.runtime.js"></script>
<script type="text/javascript" src="/_layouts/15/sp.js"></script>
<script type="text/javascript" src="../Scripts/App.js"></script>
<script type="text/javascript">
// Set the style of the client web part page to be consistent with the host web.
(function () {
'use strict';
var hostUrl = '';
var link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
if (document.URL.indexOf('?') != -1) {
var params = document.URL.split('?')[1].split('&');
for (var i = 0; i < params.length; i++) {
var p = decodeURIComponent(params[i]);
if (/^SPHostUrl=/i.test(p)) {
hostUrl = p.split('=')[1];
link.setAttribute('href', hostUrl + '/_layouts/15/defaultcss.ashx');
break;
}
}
}
if (hostUrl == '') {
link.setAttribute('href', '/_layouts/15/1033/styles/themable/corev15.css');
}
document.head.appendChild(link);
})();
</script>
</head>
<body>
<div>
<p id="message">
<!-- The following content will be replaced with the user name when you run the app - see App.js -->
initializing...
</p>
</div>
</body>
</html>
However I still get the error TypeError: SP.SOD is undefined
in the Console. The file sp.js
is loaded properly. Any solutions? When I call the app itself via its url, it works fine, it just fire this error when inserting the app part into sharepoint.
Solución
I found the answer myself. Since a App Part is included as <iframe>
it cannot access the javascript files, that have been added to the parent document. SP.SOD
is defined in init.js
, so in my case I had to include that in the file Pages/AppPart.aspx
.
<script type="text/javascript" src="/_layouts/15/init.js"></script>