SP.JSLink関数では、ClientContextは常に「未定義」です
-
10-12-2019 - |
質問
Jslink拡張機能の一部としてCSOM関数を実行して、ルックアップフィールドのレンダリングをオーバーライドしようとしています。
問題は、SPにアクセスしようとするたびに発生します。Clientcontextとして返されます 未定義
私はコンテキストをロードするためにexecuteOrDelayUntilScriptLoaded操作を呼び出そうとしましたが、これが実際に何かをする前に、私のJSLink"レンダリング"関数は常に実行されます。
SP.SOD.executeOrDelayUntilScriptLoaded(loadContext, 'sp.js');
function loadContext() {
context = SP.ClientContext.get_current();
web = context.get_web();
}
私のJSLinkコールバック関数をこの中に入れようとすると、実際には動作しません(そして私はOOBレンダリングを取得します)。
hatch.testRender = function (ctx) {
alert(context); // always returns "undefined"
}
解決
SharePoint2013CSR OnPreRender
ハンドラーは、初期化のために使用することができます ClientContext
以来 OnPreRender
実際のビュー/フィールドのレンダリングの前に呼び出されます
例を示します。:
(function () {
function OnPreRenderDocItemTemplate(renderCtx) {
SP.SOD.executeOrDelayUntilScriptLoaded(loadContext, 'sp.js');
function loadContext() {
var context = SP.ClientContext.get_current();
var web = context.get_web();
}
}
function RegisterDocViewTemplate() {
var viewContext = {};
viewContext.Templates = {};
viewContext.Templates.OnPreRender = OnPreRenderDocItemTemplate;
SPClientTemplates.TemplateManager.RegisterTemplateOverrides(viewContext);
}
ExecuteOrDelayUntilScriptLoaded(RegisterDocViewTemplate, 'clienttemplates.js');
})();
他のヒント
カスタムレンダリング機能を登録し、$(ウィンドウ)。ロードハンドラを使用して、後でJSOM呼び出しを通じて取得したコンテンツを作成するために要素を入力します。
ハンドラが実行されるまでに、必要なJavaScriptライブラリはすでにロードされており、SP.ClientContextも利用可能です。
O365 SharePoint OnlineのJSlinkを使用して同じ問題を経験しました。私の解決策は、SP.ClientContextを必要とする私の関数を次のように呼び出すことでした:
//Perform SP.ClientContext tasks after sp.js is loaded
window.onload = function() { SP.SOD.executeFunc('sp.js','SP.ClientContext', someFunction()); };
. この質問に対する他の答えをさらに解決策で追加する:
ExecuteOrDelayUntilScriptLoaded
またはSP.SOD.executeFunc
でめちゃくちゃにする代わりに、私は私のJSlinkにロードするために必要なJSOMファイルを追加しました。
これを試してみてください:
SP.SOD.executeFunc('sp.js','SP.ClientContext',loadContext);
function loadContext() {
context = SP.ClientContext.get_current();
web = context.get_web();
}
. 私は同様の問題がありました。OnInitイベント内のすべてのSP.ClientContextコードを移動したときにうまく機能しました。OnInitイベントを登録してそのイベント内部にCSOMを呼び出す必要があります。このイベントは、すべてのコントロールがロードされたら実行されます..
SP.ClientContext
が未定義であった問題はロードライブラリに問題がありました。
私の解決策は、クラウド上のMicrosoftAjaxを参照し、私の解決策ではありませんでした。
SharePointソリューションを構築すると、それ自体がしました。
参考文献を変更しました。私はライブラリをダウンロードし、私の解決策に追加し、別の単語を追加して、解決策は参照されません。
私はこの問題にも走った。
私は何が起こっていたのか疑っていたのが、コードがロードするために 'sp.js'が遅くなっている間、 'clienttemplates.js'はフルスチームを実行していて、codeがRenderListView()
を実行する前にRegisterTemplateOverrides()
を呼び出します。
これに対する私の答えは、