【问题标题】:Sharepoint Online executeQueryAsync JSOM - Return ValueSharepoint Online executeQueryAsync JSOM - 返回值
【发布时间】:2015-07-02 23:36:51
【问题描述】:

使用 Sharepoint Online 2013 使用 JSOM 构建应用程序。 当前部分是在将数据提交到列表(工作正常)之后,将打开一个模式,允许用户从该列表和其他列表中创建 PDF。当前的问题是列表中的数据必须在客户端准备好,然后才能开始将其转换为 PDF,我已经阅读了有关“Promise”方法的文献,这就是我最近一直在尝试的方法成功。

function getQuoteDetails() {

var d = $.Deferred(function(){

    var ListName = "Quote";
    var context = new SP.ClientContext.get_current();
    var lstObject = context.get_web().get_lists().getByTitle(ListName);
    var camlQuery = new SP.CamlQuery();
    //var _valuetofind = $('#QuoteID').text();
    var _valuetofind = '1';
    camlQuery.set_viewXml("<View><ViewFields>" +
        "<FieldRef Name='Q_ID' />" +
        "<FieldRef Name='CPY_ID' />" +
        "<FieldRef Name='CUST_ID' />" +
        "<FieldRef Name='Q_RaiseDate' />" +
        "<FieldRef Name='Q_DueDate' />" +
        "<FieldRef Name='Q_Price' />" +
        "<FieldRef Name='Q_GST' />" +
        "<FieldRef Name='Q_TotalPrice' />" +
        "<FieldRef Name='Q_PurchaseOrder' />" +
        "</ViewFields>" +
        "<Query><Where><Contains>" +
        "<FieldRef Name='Q_ID'/>" +
        "<Value Type='Number'>" + _valuetofind + "</Value></Contains></Where></Query></View>");

    var listItemCollection = lstObject.getItems(camlQuery);
    context.load(listItemCollection, "Include(Q_ID, CPY_ID, CUST_ID, Q_RaiseDate, Q_DueDate, Q_Price, Q_GST, Q_TotalPrice, Q_PurchaseOrder)");
    context.executeQueryAsync(onGetItemsSuccess, onGetItemsFail);

    function onGetItemsSuccess(sender, args) {
        var listItemEnumerator = listItemCollection.getEnumerator();
        while (listItemEnumerator.moveNext()) {
            var quotearray = [];

            quotearray['Q_ID'] = listItemEnumerator.get_current().get_item('Q_ID');
            quotearray['CPY_ID'] = listItemEnumerator.get_current().get_item('CPY_ID');
            quotearray['CUST_ID'] = listItemEnumerator.get_current().get_item('CUST_ID');
            quotearray['Q_RasiedDate'] = listItemEnumerator.get_current().get_item('Q_RasiedDate');
            quotearray['Q_DueDate'] = listItemEnumerator.get_current().get_item('Q_DueDate');
            quotearray['Q_Price'] = listItemEnumerator.get_current().get_item('Q_Price');
            quotearray['Q_GST'] = listItemEnumerator.get_current().get_item('Q_GST');
            quotearray['Q_TotalPrice'] = listItemEnumerator.get_current().get_item('Q_TotalPrice');
            quotearray['Q_PurchaseOrder'] = listItemEnumerator.get_current().get_item('Q_PurchaseOrder');
        }
        d.resolve(quotearray);

    }

    function onGetItemsFail(sender, args) {
        alert('Failed to get items. Error: ' + args.get_message());
    }

});
return d.promise();

}

这个代码然后被调用:

function CreateQuotePDF() {

getQuoteDetails().done(function (quotearray) {
    var quotedetails = quotearray;
    alert('Nothing'); <---- quotedetails is undefined at this point
});

alert('无'); }

希望你能帮忙!

【问题讨论】:

    标签: javascript sharepoint


    【解决方案1】:

    一些建议

    • 确保您使用的是 jQuery 版本 >= 1.5,因为 Deferred 对象 在 jQuery 1.5 中引入
    • 没有需要同时指定 CAML ViewFieldsSP.ClientContext.load 函数的第二个参数的值因为它们都用于指定要检索哪些属性
    • 总是倾向于为SP.ClientContext.executeQueryAsync 函数包含失败的回调,以便处理任何发生的错误

    话虽如此,我建议您使用以下更通用的方法来获取列表项:

    function getListItems(listTitle,propertiesToInclude)
    { 
       var ctx = SP.ClientContext.get_current();
       var web = ctx.get_web();
       var list =  web.get_lists().getByTitle(listTitle);
       var items = list.getItems(SP.CamlQuery.createAllItemsQuery());
       var includeExpr = 'Include(' + propertiesToInclude.join(',') + ')';
       ctx.load(items,includeExpr); 
       var d = $.Deferred();
       ctx.executeQueryAsync(function() {
           var result = items.get_data().map(function(i){
               return i.get_fieldValues();   
           });
           d.resolve(result);
       },
       function(sender,args){
           d.reject(args);
       });
       return d.promise();
    }
    

    在这种情况下,可以按如下所示检索列表项:

    SP.SOD.executeFunc('SP.js', 'SP.ClientContext', function() {
    
       var listTitle = 'Documents';  //set list title here
       var properties = ['Title','ID'];  //specify items properties here
       getListItems(listTitle,properties)
       .done(function(items){
          console.log(items);
       })
       .fail(function(error){
          console.log(error.get_message()); //if any error is occurred?
        });
    
    }); 
    

    【讨论】:

    • 这看起来不错,通用框架将减少代码。虽然我有几个问题要问你。如果您注意到 CAML 查询。 ' "" 非常重要,因为我只需要返回某些值并且列表可能非常大(900+),因此我很担心在数组中返回整个列表可能会很慢。 - 我可以先问一下我返回一个命名数组还是什么?
    • 关于ViewFieldsSP.ClientContext.load(clientObject,propertiesToInclude) 的 propertiesToInclude 参数具有相同的目的,特别是明确指定要检索的属性
    • 我更多的是谈论在数据检索过程中指定 WHERE 子句。但我可以得到整个数组并使用 jquery 清除非结果
    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    相关资源
    最近更新 更多