2014-01-13 25 views
0

我仍在努力获得在Visual Web部件上工作的延迟承诺链。最终目标是将某些DIV标签的颜色更改为SPList中引用的颜色。检索SP列表数据推迟承诺

我本来这段代码有一个请求,从列表中查找数据的工作,但现在我正在寻找请求的链条。首先是从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()); 
    } 
); 
} 

我想写可重用的代码,但是这让我感到这使得它更难使用延迟方法,如。那么()

我有一个函数来获取从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

那些'.done()的第二个参数'方法似乎是错误处理,但是这不是如何'.done()'起作用。当然,你可以用这种方式指定额外的处理程序,但它们全都是成功处理程序,而不是错误处理程序 - 并且全部都将接受完全相同的参数列表 - 与承诺解决的值/对象。 –

+0

'var collMenuListItem = collListItem [colkey];','var collBarListItem = collListItem [colkey];'''var collSelectionMenuAssignemntListItem = collListItem [colkey];'是多余的。而'collMenuListItem','collBarListItem'和'collSelectionMenuAssignemntListItem'稍后在各自的外部函数中使用,所有都是内部函数的形式变量,因此与之前声明的变量不同。 –

+0

谢谢甜菜根 - 甜菜根。是的,你对.done()的权利,我试图交换他们,因为你可以看到我意外地得到了一个.done()和一个.then()。我仍然无法通过阅读和再次阅读定义来找出差异。我也看过他们是可以互换的,这是错误的,因为就像你说官方文件给他们不同的论点。 –

回答

0

我有它的工作100%的时间了,这是我们的目标,但我仍然不喜欢它似乎并没有被优雅的代码,我仍与概念strugling。

我变了,

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) { 
+1

Matthew,看着代码,我认为最好的可重用性是推广枚举器对象的获取 - 即编写一个通用函数fetchEnumerator(colkey){...},它返回一个对应的枚举器的承诺。具体如何调用(a)'fetchEnumerator'并且(b)如何处理返回的promise,是特定于“alterMenuColour”,“alterBarColour”和“getMenuItemfromURLValue”这三个函数的。进一步的泛化将是自欺而复杂的。 –

+0

今天我学到了别的东西,我需要用get_lookupValue()更改$ 2d_1,因为动态属性名称更改为$ 2e_1,生产系统上没有任何警告。 –