检索SP列表数据延期承诺

时间:2014-01-13 10:43:17

标签: javascript jquery sharepoint web-parts jquery-deferred

我仍然在努力获得一系列在Visual Web Part上工作的延期承诺。最终目标是将某些DIV标记的颜色更改为SPList中引用的颜色。

我最初使用此代码处理单个请求以从列表中查找数据,但我现在正在寻找一系列请求。第一个是从window.location.href属性中查找子站点的名称。虽然这段代码正在检索考虑这个的子站点名称,好像这可能是我的第一个错误,也许我应该从SPWeb对象中获取它。然后第二个在where子句中使用此值,以从第二次调用中检索正确的数据到另一个列表。

所以代码如果现在有效,但是是间歇性的。我想我不是在正确的地方调用.resolve(),如果在调用线程使用预期结果之前异步代码已经完成,那就好了。因此它处于处理器之神的大腿上并且可能在50:50工作。这至少证明我的jQuery代码正在产生所需的结果。

我有两个函数对两个不同的DIV元素几乎完全相同。这就是我现在所拥有的。

function alterMenuColour(id) {
getMenuItemfromURLValue(window.location.href).done(function (urlSelection) {

    var colkey = 0; //this is the key for the list collection array.  This needs to be uneque for each different call to retrieveListItems.

    var promise = retrieveListItems('/sites/OMGIntranet/OMGCentral/', 'MenuItemList', '<View><Query><Where><Eq><FieldRef Name=\'MenuItem\'/><Value Type=\'Text\'>' + urlSelection + '</Value></Eq></Where></Query><RowLimit>1</RowLimit></View>', 'Id,MenuColour,BarColour', colkey);

    var collMenuListItem = collListItem[colkey];

    promise.done(
        function (collMenuListItem) {

            var listItemEnumerator = collMenuListItem.getEnumerator();

            var oListItem;

            while (listItemEnumerator.moveNext()) {
                oListItem = listItemEnumerator.get_current();
            }

            var menus = getChildElementsByType(document, id, 'div');

            jQuery(menus).children("div").each(function () {
                jQuery(this).css("background", oListItem.get_item('MenuColour'));
            });

        },
        function (sender, args) {
            alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
        }
    );
});
}

function alterBarColour() {
getMenuItemfromURLValue(window.location.href).done(function (urlSelection) {

    var colkey = 1; //this is the key for the list collection array.  This needs to be uneque for each different call to retrieveListItems.

    var barpromise = retrieveListItems('/sites/OMGIntranet/OMGCentral/', 'MenuItemList', '<View><Query><Where><Eq><FieldRef Name=\'MenuItem\'/><Value Type=\'Text\'>' + urlSelection + '</Value></Eq></Where></Query><RowLimit>1</RowLimit></View>', 'Id,MenuColour,BarColour', colkey);

    var collBarListItem = collListItem[colkey];

    barpromise.done(
        function (collBarListItem) {

            var listItemEnumerator = collBarListItem.getEnumerator();

            var oListItem;

            while (listItemEnumerator.moveNext()) {
                oListItem = listItemEnumerator.get_current();
            }

            var bar = document.getElementsByClassName('SectionMenuBar');

            jQuery(bar).each(function () {
                jQuery(this).css("background", oListItem.get_item('BarColour'));
            });

        },
        function (sender, args) {
            alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
        }
    );
});
}

我创建了一个函数getMenuItemfromURLValue(url),这是前面描述的获取子站点名称的方法。

function getMenuItemfromURLValue(url) {

var colkey = 2; //this is the key for the list collection array.  This needs to be uneque for each different call to retrieveListItems.

var promise = retrieveListItems('/sites/OMGIntranet/OMGCentral/', 'SectionMenuAssignmentList', '<View><Query><OrderBy><FieldRef Name=\'ID\'/></OrderBy></Query></View>', 'MenuItemLookup', colkey);

var collSelectionMenuAssignemntListItem = collListItem[colkey];

return promise.then(
    function (collSelectionMenuAssignemntListItem) {

        var listItemEnumerator = collSelectionMenuAssignemntListItem.getEnumerator();

        var oListItem;

        while (listItemEnumerator.moveNext()) {
            oListItem = listItemEnumerator.get_current();
            if (isStringMatch(decodeURI(url), oListItem.get_item('MenuItemLookup').$2d_1)) {
                return oListItem.get_item('MenuItemLookup').$2d_1;
            }
        }
    },
    function (sender, args) {
        alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
    }
);
}

我正在尝试编写可重用的代码,但是当我使用像.then()这样的延迟方法时,它会让人更难理解。

我有一个函数可以从SharePoint SPList获取列表数据,同样在同一主题上可以重复使用:

//http://www.shillier.com/archive/2013/03/04/using-promises-with-the-javascript-client-object-model-in-sharepoint-2013.aspx
function retrieveListItems(siteUrl, list, calm, include, collkey) {
var deferred = $.Deferred();

var clientContext
if (siteUrl == null) {
    clientContext = sharePointCurrentClientContext();
} else {
    clientContext = new SP.ClientContext(siteUrl);
}

var oList = clientContext.get_web().get_lists().getByTitle(list);

var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml(calm);

if (typeof this.collListItem === 'undefined') {
    this.collListItem = [];
}

this.collListItem.add(collkey, oList.getItems(camlQuery));

if (include == null) {
    clientContext.load(collListItem[collkey]);
} else {
    clientContext.load(collListItem[collkey], 'Include(' + include + ')');
}

clientContext.executeQueryAsync(Function.createDelegate(this, function () { deferred.resolve(collListItem[collkey]) }), Function.createDelegate(this, function (sender, args) { deferred.reject(sender, args); }));

return deferred.promise();
}

最初当我编写这个函数时,如果能够找到成功返回数据的唯一方法是在一个名为collListItem的全局列表集合对象中。这很可怕我讨厌这个并且一直试图删除它,但到目前为止还没有成功。它确实有效,并且有读,读和读,有些人建议不能通过延迟方法返回对象,并且必须将它们链接以传递数据。这再次使我能够拥有可重复使用的代码。

1 个答案:

答案 0 :(得分:0)

我现在100%的时间都在工作,这是目标,但我仍然不满意它似乎不是优雅的代码而且我还在捣蛋与概念。

我改变了,

function alterMenuColour(id) {
-    getMenuItemfromURLValue(window.location.href).done(function (urlSelection) {
+    getMenuItemfromURLValue(window.location.href, 3).done(function (urlSelection) {

function alterBarColour() {
-    getMenuItemfromURLValue(window.location.href).done(function (urlSelection) {
+    getMenuItemfromURLValue(window.location.href, 4).done(function (urlSelection) {

-function getMenuItemfromURLValue(url) {
-
-    var colkey = 2; //this is the key for the list collection array.  This needs to be uneque     for each different call to retrieveListItems.
+function getMenuItemfromURLValue(url, colkey) {