我仍然在努力获得一系列在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的全局列表集合对象中。这很可怕我讨厌这个并且一直试图删除它,但到目前为止还没有成功。它确实有效,并且有读,读和读,有些人建议不能通过延迟方法返回对象,并且必须将它们链接以传递数据。这再次使我能够拥有可重复使用的代码。
答案 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) {