2016-10-27 97 views
0

我在與SharePoint 2013開發和JavaScript的雙重學習曲線。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 ....」處返回一個錯誤「Unable to get property'get_fields'undefined or null reference」。請注意,這是爲了我的調試。

如果我改變代碼功能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 = ... 

固定的,但不明白的區別時,我得到了一個錯誤。

感謝您的任何幫助或指針。

回答

1

我花了一些時間在我的Sharepoint 2013環境中測試您的代碼。

我做了一些改變,現在它工作。

您可以看到由此產生的劇本波紋管。

以下是有關結果數組中字段名稱的一些重要信息。

Sharepoint返回的視圖中的字段名稱是內部名稱,而不是字段的標題。

這就是爲什麼你得到LinkTitle而不是你的領域的真正標題的原因。

當您在Sharepoint界面中創建一個字段時,Sharepoint會爲該字段創建一個標題,並且會根據標題創建一個內部名稱。

例如,如果我創建一個名爲«my test field»的字段,Sharepoint會說該字段的標題是「我的測試字段」,內部名稱是「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> 

希望得到這個幫助!

+0

謝謝你。 對不起,我無法對評論投票,但網站報告以下內容: –

相關問題