2009-02-27 7 views
3

J'ai deux fonctionnalités SharePoint, chacune implémentée de manière identique (voir ci-dessous), qui ajoutent des contrôles à un contrôle délégué dans l'en-tête de mes pages. L'un des contrôles dépend de l'autre (l'un est la bibliothèque jQuery, et l'autre dépend de jQuery), cependant, lorsque les contrôles sont rendus, l'ordre des contrôles est incorrect. Comment puis-je spécifier l'ordre dans lequel ces contrôles sont rendus?Ordre de rendu SharePoint DelegateControl

Le contrôle (les deux sont identiques, sauf qu'ils font référence à un fichier .js différente):

<%@ 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> 

La sortie sur la page (jQuery est déployée avant DependsOnjQuery):

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

Je souhaite que MyControl1.js s'affiche avant MyControl2.js.

Répondre

2

J'ai réussi à obtenir cela en ajoutant un second DelegateControl à l'en-tête de ma page maître, et en ajoutant jQuery à ce délégué. De cette façon, je peux m'assurer que jQuery chargera toujours avant tout le reste, sans avoir à écrire de la logique pour retarder le chargement de mes bibliothèques dépendantes.

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

Il me semble que l'attribut Sequence peut être utilisé pour contrôler l'ordre dans lequel ces types sont rendus. Donnez à votre contrôle jQuery une séquence de 50 et votre contrôle DependsOnjQuery une séquence de 100 et vous devriez être bon.

Voir le Delegate Control documentation on MSDN pour plus d'informations.

+0

C'est ce que j'ai pensé au début aussi, mais quand j'ai essayé, ça n'a pas changé l'ordre. –

0

avez-vous essayé de définir l'attribut DEFER = "DEFER" sur le script?

indique à l'agent utilisateur que le script doit attendre le chargement et le rendu de la page avant de charger le script. Sinon, vous pouvez le pirater en définissant une variable sur le script, qui est définie sur true lorsque le script est chargé. Dans l'autre, vous avez placé une logique testée (méthode think loop et timeout) si le script a été chargé, puis appelle votre logique lorsque les deux scripts sont chargés.

pas très agréable, mais vous avez besoin d'une sorte de logique pour gérer l'exécution, et pas simplement exécuter les méthodes en ligne dans votre script.

Pour nathan: les séquences dans les délégués sont utilisées pour déterminer lequel du délégué contrôle à charger. Cela ne devrait rien avoir à voir avec le problème en question. Si je comprends bien, les fichiers JS juste définir la valeur sur un script qui se trouve être un contrôle délégué.

+0

J'espérais que les séquences affecteraient plus ... parfois la documentation n'est pas ... complète. –