Hi,
ich arbeite sehr oft mit JSLink um Formulare oder Ansichten anzupassen.
Im großen und ganzen funktioniert das auch wunderbar. Leider habe ich manchmal das Phänomen, dass die Scripts nicht geladen bzw. ausgeführt werden (geladen schon).
MDS ist aus.
Wir haben bei uns auch ein etwas "komplexeres" Verfahren etabliert, um allen Seiten die gleiche JSLink Version bereitzustellen:
In der Root-SiteCollection befinden sich die Scripte, welche dynamisch eingebunden werden sollen. Hier hat jeder Lese-Recht.
In den jeweiligen Seiten befinden sich die JSLink-Scripte, welche die eigentlichen Scripte dynamisch laden. Dies geschieht mit folgendem Aufruf:
(function(){ var scriptKey = "TagCloudSource.js"; var scriptLink = "/Scripts/Source/TagCloud/TagCloudSource.js"; SP.SOD.executeFunc("clienttemplates.js", "SPClientTemplates", function(){ SP.SOD.registerSod(scriptKey,scriptLink); SP.SOD.executeFunc(scriptKey, null, function(){ console.log("ScriptOnDemand loaded: " + scriptKey); }); }); /* config part */ SP.SOD.executeOrDelayUntilScriptLoaded(function () { MyNamespace.TagCloud.tagCloudTitle = "Top Tags für '{0}'"; // title for each tag cloud based on field name MyNamespace.TagCloud.tagDelim = ' | '; // delimiter between the tags MyNamespace.TagCloud.tagAutoSize = true; // calculated size for each tag depending on occurrence MyNamespace.TagCloud.ListTemplateType = 850; // 850 --> Pages library MyNamespace.TagCloud.showTagCount = true; // Display total count for each tag MyNamespace.TagCloud.RegisterTemplate(); }, scriptKey);})();
Die eigentlichen Scripte haben dann immer als letzte Zeile folgendes im Bauch:
// notify final script loadSP.SOD.notifyScriptLoadedAndExecuteWaitingJobs("TagCloudSource.js");
Sobald ich die Entwicklungsconsole offen lasse, funktionieren die Aufrufe zu 100%. Sonst kommt es vor, das ab und zu beim Aufruf die Scripte nicht feuern....
Woran könnte das Verhalten liegen?
Könnten irgenwelche Timeouts oder so beim Nachladen dafür sorgen?
Danke euch :)
SharePoint Enthusiast
Ich helfe gern, wenn es mein Zeit zu lässt :)Gern auch per direkter Anfrage auf XING
Dieses Script-On-Demand Zeug ist ziemlich sicher das Problem. Vermutlich kommt es einfach vor, daß in manchen Fällen Deine Scriptdatei nicht rechtzeitig zur Verfügung steht. Beim Ausführen mit Debugger ist die Ausführung (wegen des Debuggers) so verlangsamt, daß immer genug Zeit ist, die Datei nachzuladen. Ich würde versuchen davon wegzukommen.
Warum macht Ihr das so? Ihr könnt doch die Dateien im Root lassen und trotzdem überall direkt als JSLink einbinden. Oder auch in den Layouts-Ordner schmeißen und von dort referenzieren.
1. JSLink erlaubt nur relative Links zur jeweiligen SiteCollection. Ein Link direkt ins Root geht nicht (zumindest war das in den Tests immer der Fall)
2. Dieser Aufbau erlaubt es uns die Konfig pro SiteCollection nochmals ggf. anzupassen (siehe Config-Part)
3. Im Layouts wäre theoretisch gut, aber dann komme ich nicht ran, ohne Admin-Rechte auf die Server (ist bei uns sehr stark reklementiert)
4. Im Layouts muss es bei jeder Anpassungen auf allen WFE-Servern nachgezogen werden
5. Im Layouts haben wir nicht die Möglichkeit das Script in einem Entwurfsmodus bereitzustellen um es zu testen (jetzt in der Bibo ist das möglich dank Versionierung :) )
Welche Alternative zu dem SOD hätte ich denn noch...
Ich lasse alle Deine Argumente gelten (außer 1.) und kenne natürlich solche Beschränkungen. Sollte nur ein Vorschlag sein, wie man es auch machen könnte.
Wie man das gewünschte Szenario ohne SOD, aber trotzdem dynamisch machen könnte, weiß ich auch nicht. Mit SOD habe ich allerdings schon viele schlechte Erfahrungen gemacht.
Bei 1. war auch eher gemeint, dass es dann keine Möglichkeit gibt, diese als "Custom Views" dem Endanwender für spezielle Listen direkt anzubieten...
Manuell kann ich da vieles reinlinken... Aber das war nicht unser Anspruch :)
Leider hab ich auch keinen Ansatz, wie ich das Verhalten des "nicht ladens" provozieren kann. In über 90% der Fälle gehts ja wie gesagt. Und wie du schon sagtest, mit der Console gehts zu 100%, selbst wenn ich das permanete Neuladen etc. ausstelle.
Sicher müssen wir uns damit irgendwie noch weiter auseinander setzen. vielleicht find ich noch einen Workaround...