SharePoint SOAP GetListItems VS jQuery - Wie man Ajax verwenden, um durch eine Benutzerdefinierte Liste von Objekten als auch als Ajax-refresh-die Inhalte der Liste?
Bin ich mit Hilfe von jQuery für den Zugriff auf Sharepoint 2007 die SOAP-Schnittstelle, über die Methode GetListItems zu Lesen in einer benutzerdefinierten Liste von Ankündigungen in solch einer Weise zu, die Liste aktualisieren, sobald eine minute (im Falle, dass der Besitzer der Liste neue Inhalte hinzufügen, so dass der neue Inhalt sichtbar wird, ohne dass der end-Nutzer aktualisieren Ihre sharepoint-Bildschirm). Was würde ich gerne tun, ist nicht nur erfrischen, Liste, ich möchte jedes Element in der Liste Durchlaufen, ein zu einer Zeit (vielleicht jedes Element sichtbar bleibt für 10 Sekunden, dann der nächste Artikel geladen, in diesem Raum.
Hier ist der code, den ich bisher:
<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="/SiteCollectionDocuments/jquery.timers-1.0.0.js" ></script>
<script type="text/javascript">
$(document).ready(function() {
//Create the SOAP request
//NOTE: we need to be able to display list attachments to users, hence the addition of the
//<queryOptions> element, which necessitated the addition of the <query> element
var soapEnv =
"<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>
<soapenv:Body> \
<GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
<listName>testlist</listName> \
<viewFields> \
<ViewFields> \
<FieldRef Name='Title' /> \
<FieldRef Name='Body' /> \
<FieldRef Name='ID' /> \
<FieldRef Name='Attachments' /> \
</ViewFields> \
</viewFields> \
<query> \
<Query /> \
</query> \
<queryOptions> \
<QueryOptions> \
<IncludeAttachmentUrls>TRUE</IncludeAttachmentUrls> \
</QueryOptions> \
</queryOptions> \
</GetListItems> \
</soapenv:Body> \
</soapenv:Envelope>";
//call this SOAP request every 20 seconds
$("#tasksUL").everyTime(20000,function(i){
//our basic SOAP code to hammer the Lists web service
$.ajax({
url: "http://ourdomain.net/_vti_bin/lists.asmx",
type: "POST",
dataType: "xml",
data: soapEnv,
error: printError,
complete: processResult,
contentType: "text/xml; charset=\"utf-8\""
});
});
});
//basic error display that will pop out SOAP errors, very useful!
function printError(XMLHttpRequest, textStatus, errorThrown)
{
alert("There was an error: " + errorThrown + " " + textStatus);
alert(XMLHttpRequest.responseText);
}
//main method that will cycle through the SoAP response nodes
function processResult(xData, status)
{
$(xData.responseXML).find("z\\:row").each(function()
{
//resets display element
$("#tasksUL").empty();
//gets attachments array - if there is more than one attachment,
//they get seperated by semi-colons in the response
//they look like this natively (just an example):
//ows_Attachments = ";#http://server/Lists/Announcements/Attachments/2/test.txt;
//#http://server/Lists/Announcements/Attachments/2/UIP_Setup.log;#"
var mySplitResult = $(this).attr("ows_Attachments").split(";");
//set up storage for later display of images
var notice_images = "";
//processes attachments - please forgive the kludge!
for(i = 0; i < mySplitResult.length; i++)
{
//check to see the proper link URL gets chosen
if (i % 2 != 0 && i != 0)
{
//strips out pound sign
mySplitResult[i] = mySplitResult[i].replace("#", "");
//(possibly redundant) check to make sure element isn't simply a pound sign
if (mySplitResult[i] != "#")
{
//adds an img tag to an output container
notice_images = notice_images + "<img src='" + mySplitResult[i] + "' border='0' align='right' style='float:right;' /><br />";
}
}
}
//create final output for printing
var liHtml = "<h3>" + $(this).attr("ows_Title") + "</h3><p>" + notice_images + $(this).attr("ows_Body") + "</p>";
//assign output to DIV tags
$("#tasksUL").html(liHtml);
});
}
</script>
<div id="tasksUL"/> </div>
Es ist ziemlich einfaches Zeug, so weit (obwohl die Suche nach eine anständige Dokumentation, was Sie in der Lage sind zu tun mit der GetListItem SOAP-Anfrage war gewaltig). Im inneren des Blocks, wo ich Durchlaufen der zurückgegebenen Zeilen (die PprocessResult Funktion), ich bin das zurücksetzen der HTML-Zuordnung zu den DIV-block, so dass nur eine Zeile zeigt, die als Ausgabe. Die Art und Weise der code aufgebaut ist, dies bedeutet, dass nur die Letzte Zeile in meine benutzerdefinierte Liste sichtbar sein wird, da ich keinen code anhalten der Iterationen.
Mein Gedanke war es gewesen, wickeln Sie einen timer, um dieses code-block:
$(xData.responseXML).find("z\\:row").each(MYTIMER(10000, function(){...
Aber ich traf mit null oder gemischte Ergebnisse.
Meine Frage an Euch alle ist: Was wäre der beste Weg, um auf meinen aktuellen code um beide aktualisieren der Liste Quelle die Daten wie es jetzt ist, UND radeln Sie durch die Abfrage-Ergebnisse aus dieser Liste eine zu einem Zeitpunkt (vorzugsweise mit einer kleinen pause auf jedem item so, dass die Leute es Lesen können)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde halten Sie Ihr visual-Zyklus und Ihre Daten update-Zyklus als separate Einheiten.
Richten Sie Ihre timeout-Funktion zu aktualisieren, ein container divs mit Ihren Daten angezeigt innerhalb. Sie können hinzufügen und entfernen aus dieser Liste, um Ihrem Wunsch.
Vielleicht beginnen Sie mit etwas wie:
Und dann nach einem Daten-update-es könnte noch ein weiteres element:
Dann mit einem cycle-plugin, um einfach Zyklus durch das geordnete Sammlung von divs innerhalb eines bestimmten container-element. Es wird immer nur der nächste div in die Sammlung, anstatt sich auf das update-plugin zu starten Sie den Zyklus.
Das beliebteste plugin, um durch Elemente in jQuery ist jquery.cycle.js bei http://malsup.com/jquery/cycle2/ . Sie könnten auch interessiert sein in der "lite" - version, die verfügbar ist online.
Tatsächlich, und es gab keine Möglichkeit für jedermann zu wissen, der Grund dafür war ein Fehlschlag war, da hatte jemand installiert eine Websitesammlung jQuery-Paket, das war alt und funktionierte nicht sehr gut mit jCycle. Einmal habe ich deaktiviert, die Funktion auf die Sammlung, den IIS neu gestartet, und aktualisiert die Seite, funktioniert alles einwandfrei. Als einen zusätzlichen Schritt, ich habe die Letzte vollständige version von jQuery in einem Dokument Bibliothek, und mit ihm, anstatt die von Google gehostete version des Skripts. Also, an alle die js bin ich mit dem Leben in der Website-Sammlung jetzt.
War ich in der Lage, um herauszufinden, über die widersprüchliche Versionen von jQuery, aber mit Firebug die Konsole und Skript-debugger. So musste ich den debugger, um den halt auf alle Fehler, aber der erste Fehler kam, verweisen auf die site collection jQuery-Paket und die meinen nicht im Lieferumfang enthalten Google code. Das ist der Grund, ich beantworte meine eigene Frage. Es gibt auch andere Arme Schweine da draußen SharePoint-Entwicklung und es kann nicht geschehen, FireFox testen Sie Ihr SP-Installationen gegeben, wie viel es bevorzugt den IE und alle.
Danke an alle, die gelesen und beantwortet/kommentiert werden!