"财产或字段' Id'尚未初始化。它没有被要求......"尝试通过JavaScript访问SharePoint中的库的GUID时

时间:2014-07-21 10:36:32

标签: javascript sharepoint sharepoint-2013 client-object-model sharepoint-clientobject

我正在尝试使用SharePoint 2013中的客户端对象模型访问库的ID。但是我收到的错误是:

  

属性或字段“Id”尚未初始化。尚未请求或请求尚未执行。可能需要明确要求。

以下是我的代码:

var context = SP.ClientContext.get_current();
var web = context.get_web();
var items = SP.ListOperation.Selection.getSelectedItems(context);
var currentLibrary = web.get_lists().getById(SP.ListOperation.Selection.getSelectedList(context));
context.load(currentLibrary, 'id'); // Tried with 'Id' but still throws error
console.log(currentLibrary);
console.log("currentLibrary.get_id = " + currentLibrary.get_id()); // THROWS ERROR!

我在这里做错了什么?

4 个答案:

答案 0 :(得分:5)

错误:

  

财产或字段' Id'尚未初始化。它一直没有   请求...

发生,因为List对象已请求

使用SP.ClientContext.executeQueryAsync method 在服务器上异步执行当前待处理请求

一个工作示例:

var context = SP.ClientContext.get_current();
var web = context.get_web();
var listId =  SP.ListOperation.Selection.getSelectedList(context); 
var list = web.get_lists().getById(listId);
context.load(list, 'Id');  //tell SharePoint to load List Id property
context.executeQueryAsync(  //submit query to the server
  function(){
    console.log("ID:" + list.get_id()); //process result in success callback
  }, 
  function(sender,args){
    console.log(args.get_message());    //handle error in error callback
  }
);

答案 1 :(得分:0)

我的问题恰巧是一个愚蠢的问题,我回来的专栏最初是使用名称Requestor_DisplayName创建的,后来更改为Employee_DisplayName,因此在使用时:

oListItem.get_item('Employee_DisplayName');

我得到了>

"The property or field 'Id' has not been initialized. It has not been requested…" error

该问题与SP.ClientContext.executeQueryAsync方法本身无关......

当我将代码更改为:

oListItem.get_item('Requestor_DisplayName');

它没有问题。您可以使用SP CAML Query Helper Online来检查您的列表和列(以及构建CAML查询),这就是我发现问题的方法:

Screenshot

希望这可以帮助将来的某个人!

感谢。 SG。

再回来编辑这个答案,因为今天在概念上发现了另一个关于此错误消息的发现,我没有意识到SharePoint会在32个字符之后修剪你的列名......

我在开发者工具中获得了与以前完全相同的错误消息>调试控制台(IE f12),但当然是一个不同的列。

"The property or field 'Operations_Approver1_Display_Name' has not been initialized. It has not been requested…"

我检查列表设置中的列名称后,我的头部被刮了一下,就像我在JSOM中一样,列名是“Operations_Approver1_Display_Name”(是的,我曾经是COBOL开发人员所以我喜欢很长很有意义的名字LOL)

oListItem.get_item('Operations_Approver1_Display_Name');

所有人似乎都退房了,我想“好吧,也许我有一个原始列名称的类型,并且不记得修复它”当然我自然而然地打开了,SP CAML查询助手在线(男人,我这个工具,是的,b是故意LOL)。

这就是我发现SharePoint列名限制为32个字符的方法,只是想更新这个答案,因为它在搜索中排名很高。正如您在下面的屏幕截图中看到的那样,列的InternalName名称已从其“Title”列名称中缩短了一个字符(保留给我以使此名称长度超过限制的33个字符)

enter image description here

答案 2 :(得分:0)

使用Vadim回答:

var oItem ='';
function retrieveWebSite() {
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function(){
        var clientContext = new SP.ClientContext.get_current();
        this.oWebsite = clientContext.get_web();
        clientContext.load(this.oWebsite);

        var lstObject = oWebsite.get_lists().getByTitle('Listname');
        oItem = lstObject.getItemById(5);
        clientContext.load(oItem);

        clientContext.executeQueryAsync(
            Function.createDelegate(this, this.onQuerySucceeded), 
            Function.createDelegate(this, this.onQueryFailed)       
        );
    });
}

function onQuerySucceeded(sender, args) {
    var look  = oItem.get_item('LookupColumnName').get_lookupValue();
    var title = oItem.get_item('Title');
    var id = oItem.get_id();
    alert("Loook up column value: "+look);
    alert("Title column: "+title);
    alert("Id column value: "+id);
}

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

答案 3 :(得分:-2)

你正在寻找ids,然后这样做: -

var context = SP.ClientContext.get_current();
var web = context.get_web();
var items = SP.ListOperation.Selection.getSelectedItems(context);
for (var i = 0; i < items.length; i++) {
     var id= items[i].id; 
}

谢谢:)