我正在尝试使用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!
我在这里做错了什么?
答案 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查询),这就是我发现问题的方法:
希望这可以帮助将来的某个人!
感谢。 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个字符)
答案 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;
}
谢谢:)