2009-02-27 5 views
3

Ich habe zwei SharePoint-Features, die jeweils identisch implementiert (siehe unten), die Steuerelemente zu einem Delegate-Steuerelement in der Kopfzeile meiner Seiten hinzufügen. Eines der Steuerelemente hängt von dem anderen ab (eines ist die jQuery-Bibliothek und das andere hängt von jQuery ab). Wenn die Steuerelemente gerendert werden, ist die Reihenfolge der Steuerelemente jedoch falsch. Wie gebe ich die Reihenfolge an, in der diese Steuerelemente gerendert werden?SharePoint DelegateControl Renderauftrag

Die Steuerung (beide sind identisch, außer dass sie eine andere Datei verweisen Js):

<%@ Control ClassName="MyScriptControl" %> 
<script type="text/javascript" src="/_layouts/MyScript.js"></script> 

feature.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<Feature Id="AA9D59AC-D53E-4338-9B52-CD39F2A8C31A" 
    ActivateOnDefault="true" 
    Title="My Feature" 
    Description="Does something." 
    Scope="Site" Version="1.0.0.0" 
    Hidden="FALSE" 
    DefaultResourceFile="core" 
    xmlns="http://schemas.microsoft.com/sharepoint/"> 
    <ElementManifests> 
     <ElementManifest Location="MyFeature\Elements.xml" /> 
    </ElementManifests> 
</Feature> 

Elements.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<Elements xmlns="http://schemas.microsoft.com/sharepoint/" 
    Id="24A4BB9A-9636-4a73-B3A5-35661DE19902"> 
    <Control Id="AdditionalPageHead" 
     ControlSrc="~/_controltemplates/MyControl.ascx" /> 
</Elements> 

Die Ausgabe auf der Seite (jQuery wird vor DependsOnjQuery bereitgestellt):

<script type="text/javascript" src="/_layouts/DependsOnjQuery.js"></script> 
<script type="text/javascript" src="/_layouts/jQuery.min.js"></script> 

Ich möchte MyControl1.js vor MyControl2.js rendern.

Antwort

2

Ich konnte dies zum Laufen bringen, indem ich ein zweites DelegateControl zum Header meiner Masterpage hinzufügte und jQuery zu diesem Delegaten hinzufügte. Auf diese Weise kann ich sicherstellen, dass jQuery immer vor allem anderen lädt, ohne dass ich eine Logik schreiben muss, um das Laden meiner abhängigen Bibliotheken zu verzögern.

<SharePoint:DelegateControl runat="server" ControlId="jQueryDelegate" AllowMultipleControls="true"/> 
<SharePoint:DelegateControl runat="server" ControlId="AdditionalPageHead" AllowMultipleControls="true"/> 
1

Es sieht für mich so aus, als ob das Sequenz-Attribut verwendet werden kann, um die Reihenfolge zu steuern, in der diese Typen gerendert werden. Geben Sie Ihrem jQuery-Steuerelement eine Sequenz von 50, und DependsOnjQuery steuert eine Sequenz von 100, und Sie sollten gut sein.

Weitere Informationen finden Sie unter Delegate Control documentation on MSDN.

+0

Das dachte ich auch zuerst, aber als ich das ausprobierte, änderte es die Reihenfolge nicht. –

0

haben Sie versucht, das Attribut DEFER = "DEFER" für das Skript festzulegen.

, die dem Benutzer-Agent mitteilt, dass das Skript auf das Laden und Rendern der Seite warten sollte, bevor das Skript geladen wird.

Sonst könnten Sie es hacken, indem Sie eine Variable auf das eine Skript setzen, das auf True gesetzt wird, wenn das Skript geladen wird. Im anderen Fall haben Sie eine Logik platziert, die getestet wurde (Think-Loop- und Timeout-Methode), wenn das Skript geladen wurde und dann Ihre Logik aufruft, wenn beide Skripte geladen sind.

nicht sehr nett, aber Sie brauchen eine Art von Logik zur Ausführung, und nicht nur die Methoden inline in Ihrem Skript ausführen.

Um nathan: Sequenzen in Delegaten werden verwendet, um zu bestimmen, welche der Delegiertensteuerelemente geladen werden soll. Dies sollte mit dem fraglichen Thema nichts zu tun haben. Wie ich es verstehe, legen die JS-Dateien nur den Wert eines Skripts fest, das gerade ein Delegate-Steuerelement ist.

+0

Ich hatte gehofft, die Sequenzen würden mehr beeinflussen ... manchmal ist die Dokumentation nicht ... vollständig. –