سؤال

أحاول تنفيذ وظائف CSOM كجزء من امتداد JSLink لتجاوز عرض حقل البحث.

المشكلة هي في كل مرة أحاول الوصول إلى SP.ClientContext فإنه يعود كـ غير معرف

لقد حاولت استدعاء عملية ExecuteOrDelayUntilScriptLoaded لتحميل السياق، ولكن وظائف "عرض" JSLink الخاصة بي تنفذ دائمًا WAY قبل أن يفعل هذا أي شيء فعليًا.

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"
}
هل كانت مفيدة؟

المحلول

شيربوينت 2013 المسؤولية الاجتماعية للشركات 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');

})();

نصائح أخرى

عملت في هذه المشكلة من خلال الحصول على وظيفة Render المخصصة، إرجاع عنصر HTML للعنصر النائب، واستخدام المعالج $ (نافذة). تحميل المعالج لاحقا العنصر مع المحتوى الذي تم الحصول عليه من خلال مكالمات JSOM.

بحلول الوقت الذي ينفذ المعالج، تم بالفعل تحميل مكتبات JavaScript اللازمة بالفعل، و SP.ClientContext متاح أيضا.

لقد واجهت نفس المشكلة باستخدام JSLink في O365 SharePoint Online.كان الحل الخاص بي هو استدعاء وظيفتي التي تتطلب sp.clientcontext على النحو التالي: giveacodicetagpre.

إضافة إجابة أخرى لهذا السؤال مع حل آخر:

بدلا من العبث بها ExecuteOrDelayUntilScriptLoaded أو SP.SOD.executeFunc, لقد قمت ببساطة بإضافة ملفات JSOM التي كنت بحاجة إليها لتحميلها في JSLink الخاص بي.

لذلك، على سبيل المثال، كنت بحاجة لاستخدام SP.WorkflowServices مساحة الاسم.من أجل استخدام ذلك، وفقا ل صفحة MSDN هذه, ، الملفات المطلوبة هي:

  • SP.js
  • SP.Runtime.js
  • SP.WorkflowServices.js

وبالطبع يجب تحميلها بالترتيب.لذلك يبدو JSLink الخاص بي للحقل المحدد الذي أتجاوزه كما يلي:

clienttemplates.js|sp.js|sp.runtime.js|sp.workflowservices.js|~site/path/to/my-csr-script.js

وأي إطار يتعامل مع تحميل ملفات JSLink يحترم الترتيب، بحيث يتم تحميل الملفات بشكل صحيح، ويمكنني استخدامها SP.WorkflowServices في رمز تجاوز المسؤولية الاجتماعية للشركات الخاص بي.

جرب هذا: giveacodicetagpre.

كان لدي مشكلة مماثلة.لقد عملت بشكل جيد عندما نقلت كل رمز Sp.ClientContext داخل حدث OnInIT.تحتاج إلى تسجيل OnInit Event واتصل CSOM داخل هذا الحدث.ينفذ هذا الحدث بمجرد تحميل جميع عناصر التحكم ..

المشكلة التي واجهتني مع SP.ClientContext غير محدد كان مشكلة في مكتبة التحميل.

لقد أشار الحل الخاص بي إلى MicrosoftAjax على السحابة وليس الحل الخاص بي.

أعتقد أنه عندما تقوم ببناء حل SharePoint، فإنك تفعل ذلك بنفسك.

لقد حللت تغيير المراجع.لقد قمت بتنزيل المكتبة وأضفتها إلى الحل الخاص بي، وبعبارة أخرى، لا توجد مراجع للحل.

لقد واجهت هذه المشكلة أيضا.

كنت أظن أن ما يحدث هو أنه بينما يتأخر الكود في تحميل "SP.js"، فإن "clientTemplates.js" يعمل بكامل طاقته ويتصل RenderListView() قبل أن يتم تنفيذ التعليمات البرمجية RegisterTemplateOverrides().

كانت إجابتي على ذلك هي الاستفادة من إجابة @Aveenav لتجاوز BaseViewId استخدام قيم BaseViewID مختلفة لرابط JSLink المتعدد في صفحة واحدة

(function(){
    //Delay the execution of RenderListView until sp.js is loaded
    ExecuteOrDelayUntilScriptLoaded(function() {
         //Take a copy of the existing Microsoft Definition of RenderListView
         var oldRenderListView = RenderListView;

         //Now delay the execution of the rest of RenderListView until sp.js is loaded
         RenderListView = function(ctx,webPartID) {
             ExecuteOrDelayUntilScriptLoaded(function() {
                 oldRenderListView(ctx,webPartID);
             }, 'sp.js');
         }
    }, 'ClientTemplates.js');
    // Continue with Template Overrides
})();

أظهر اختبار هذا أنه يمكنني الوصول إلى SP.ClientContext داخل ملف onPostRender() الوظيفة (التي كانت حيث كنت في حاجة إليها.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى sharepoint.stackexchange
scroll top