Sharepoint 2013 Javascript -获取列表字段

Sharepoint 2013 Javascript - Get List Fields

本文关键字:列表 字段 获取 2013 Javascript Sharepoint      更新时间:2023-09-26

我在SharePoint 2013开发和JavaScript的双重学习曲线。

请参考下文

function GetListFields(listname, viewname, ResultCallBackFunction)
{
  var clientContext = new SP.ClientContext.get_current();
  var web = clientContext.get_web();
  var list = web.get_lists().getByTitle(listname);
  if (viewname == "")
  {
    var view = list.get_views().getByTitle(viewname);
    var listFields = view.get_viewFields(); 
  }
  else
  {
    this.listFields = list.get_fields().getByInternalNameOrTitle("Title");  
  } 
  clientContext.load(this.listFields);
  clientContext.executeQueryAsync(onListFieldsQuerySucceeded, onListFieldsQueryFailed);

  function onListFieldsQuerySucceeded()
  {
    console.log(listFields.get_fields().getByInternalNameOrTitle("Title").get_internalName());
    var fldArray = new Array();
    var fieldEnumerator = listFields.getEnumerator();
    while (fieldEnumerator.moveNext())
    {
      var oField = fieldEnumerator.get_current();
      fldArray.push(oField);
    }
    ResultCallBackFunction(fldArray);
  }
  function onListFieldsQueryFailed()
  {
    alert("Something went wrong. The End is Nigh.");
  }
}

目的是调用GetListFields返回一个包含列表字段名的数组。这将在"console.log...."行返回错误"无法获取未定义或null引用的属性'get_fields'"。请注意,这是为了我的调试。

如果我更改函数GetListFields的代码,如下所示:

var clientContext = new SP.ClientContext.get_current();
var web = clientContext.get_web();
var list = web.get_lists().getByTitle(listname);
if (viewname == "")
    viewname = "All Items";
var view = list.get_views().getByTitle(viewname);
this.listFields = view.get_viewFields(); 

我确实得到了一个结果,但这包含一个名为"LinkTitle"的字段,我没有在我的列表中,因为我已经重命名了这个。我错过了什么?

更进一步,当使用

时,我得到了一个错误
var listFields = ...

修复

this.listFields = ...

但不明白两者的区别

感谢您的帮助和指点。

我花了一点时间在我的Sharepoint 2013环境中测试了你的代码。

我做了一些改变,现在它可以工作了。

您可以看到下面的结果脚本。

下面是关于结果数组中字段名的一些重要信息。

Sharepoint返回的视图中字段的名称是内部名称,而不是字段的标题。

这就是为什么你得到LinkTitle而不是你的字段的真正标题的原因。

当您在Sharepoint界面中创建一个字段时,Sharepoint会为该字段创建一个标题,并根据该标题创建一个内部名称。

例如,如果我创建一个名为«my test field»的字段,Sharepoint将显示该字段的标题为«my test field»,内部名称为«my_x0020_test_x0020_field»。

<script>
function GetListFields(listname, viewname, ResultCallBackFunction)
{
  var clientContext = new SP.ClientContext.get_current();
  var web = clientContext.get_web();
  var list = web.get_lists().getByTitle(listname);
  var listFields;
  var view;
  var defaultViewName = 'All Items';
  if (viewname === "")
  {
    viewname = defaultViewName;
  }
  view = list.get_views().getByTitle(viewname);
  listFields = view.get_viewFields();
  clientContext.load(listFields);
  clientContext.executeQueryAsync(onListFieldsQuerySucceeded, onListFieldsQueryFailed);
  function onListFieldsQuerySucceeded()
  {
    var fldArray = new Array();
    var fieldEnumerator = listFields.getEnumerator();
    while (fieldEnumerator.moveNext())
    {
      var oField = fieldEnumerator.get_current();
      fldArray.push(oField);
    }
    ResultCallBackFunction(fldArray);
  }
  function onListFieldsQueryFailed()
  {
    alert("Something went wrong. The End is Nigh.");
  }
}
function MyCallBack(fieldArray) {
  for (var x=0;x<fieldArray.length;x++) {
    console.log(fieldArray[x]);
  }
}
</script>
<a id="callGetListFields" href="#" onclick="GetListFields('MyListName','MyViewName', MyCallBack);">Call function GetListFields</a>

希望这有帮助!