【问题标题】:SHAREPOINT 2013: How can I update a Site Column with the content of an array with javascript CSOM?SHAREPOINT 2013:如何使用 javascript CSOM 使用数组的内容更新站点列?
【发布时间】:2015-07-09 22:27:24
【问题描述】:

我是 Sharepoint 2013 的新手,我正在尝试使用数组的内容更新站点列的内容,我可以检索和可视化我的站点列的内容,用户能够更改和保存必要的部分并将更改保存到一个数组中,现在我必须用数组的内容更新站点栏的内容,但是由于某种原因我无法做到这一点,有什么建议/例子吗?到目前为止,这是我检索、可视化站点列并将 mofication 存储到我的数组中的代码。

<body>
        <select id="dropdown" name="dropdown" onchange="optSelect()">
            <option value="EngineType_Cylinders">EngineType_Cylinders</option>
            <option value="EngineType_EngineCycle">EngineType_EngineCycle</option>
            <option value="EngineType_EngineFamily">EngineType_EngineFamily</option>
            <option value="EngineType_Euro">EngineType_Euro</option>
            <option value="EngineType_FamilyEvolution">EngineType_FamilyEvolution</option>
            <option value="EngineType_GasEmissionLevel">EngineType_GasEmissionLevel</option>
            <option value="EngineType_Power">EngineType_Power</option>
            <option value="EngineType_PowerSupply">EngineType_PowerSupply</option>
            <option value="EngineType_Use">EngineType_Use</option>
        </select><br />

        <textarea id="textareadisplay" rows="25" cols="23"></textarea><br />
        <input type ="button" value="Update values" onclick="addItemsToColumns()" />
    </body>

我的 Javascript

$(function () {
    SP.SOD.executeOrDelayUntilScriptLoaded(Function.createDelegate(this, function () {
       var select = document.getElementById('dropdown').value;
        console.log(select);
        getSiteColumns(select);

    }), 'SP.js');
});

var fieldChoice;
var choices;
var addFields = [];
var slc;
var clientContext;

function optSelect() {
    slc = document.getElementById('dropdown').value;
    getSiteColumns(slc);
}

function getSiteColumns(selection) {
   clientContext = SP.ClientContext.get_current();
    if (clientContext != undefined && clientContext != null) {

        var web = clientContext.get_web();

        fieldChoice = clientContext.castTo(web.get_availableFields().getByTitle(selection), SP.FieldChoice);

        clientContext.load(this.fieldChoice);
        clientContext.executeQueryAsync(Function.createDelegate(this, this.OnLoadSuccess), Function.createDelegate(this, this.OnLoadFailed));
    }
}

function OnLoadSuccess(sender, args) {
    choices = fieldChoice.get_choices();
    var textarea = document.getElementById("textareadisplay");
    textarea.value = choices.join("\n");

}

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

function addItemsToColumns() {
    clientC = SP.ClientContext.get_current();
    var arrayForUpdate = $('#textareadisplay').val().split('\n');
    fieldChoice.set_item(, arrayForUpdate);
    fieldChoice.update();
    clientContext.executeQueryAsync(function () { }, function () { });


}

function OnUpdateSuccess(sender, args) {
    var newchoices = fieldChoice.get_choices();

}

我的问题在于函数 addItemsToColumns() 请帮忙!提前致谢。

【问题讨论】:

    标签: javascript sharepoint-2013 csom site-column


    【解决方案1】:

    修改示例

    下面的修改示例应该可以解决问题:

    SP.SOD.executeFunc('SP.js', 'SP.ClientContext', function() {
         var fieldName = $('#dropdown').find(":selected").text();   //get selected column
         populateValues(fieldName);
    });
    
    
    function populateValues(fieldName)
    {
        getFieldChoice(fieldName,
          function(field){
               var values = field.get_choices();             
               $("textarea#textareadisplay").val(values.join("\n"));
          },
          function(sender,args){
             console.log(args.get_message());  //handle errors..
          });
    }
    
    
    
    function addItemsToColumns() {
        var fieldName = $('#dropdown').find(":selected").text();   //get selected column
        var values = $('textarea#textareadisplay').val().split('\n');
        updateFieldChoice(fieldName,values,
           function(field){
             console.log(String.format('{0} field has been updated',fieldName)); 
          },
          function(sender,args){
             console.log(args.get_message());  //handle errors..
          });
    }
    
    
    
    //SharePoint specific function for getting choice column 
    function getFieldChoice(fieldTitle,success,failure) {
        var ctx = SP.ClientContext.get_current();
        var web = ctx.get_web();
        var fieldChoice = ctx.castTo(web.get_fields().getByTitle(fieldTitle), SP.FieldChoice);
        ctx.load(fieldChoice);
        ctx.executeQueryAsync(
             function(){
                success(fieldChoice)
             },
             failure);
    }
    
    //SharePoint specific function for updating choice column
    function updateFieldChoice(fieldTitle,choiceValues,success,failure) {
        var ctx = SP.ClientContext.get_current();
        var web = ctx.get_web();
        var fieldChoice = ctx.castTo(web.get_fields().getByTitle(fieldTitle), SP.FieldChoice);
        fieldChoice.set_choices(choiceValues);
        fieldChoice.update();
        ctx.executeQueryAsync(
             function(){
                success(fieldChoice)
             },
             failure);
    }
    

    一些建议

    • 更喜欢SP.SOD.executeFunc SP.SOD.executeOrDelayUntilScriptLoaded 因为它支持 load on 需求脚本
    • 避免使用全局变量

    【讨论】:

    • 好的,我粘贴了您的代码,我将函数“addItemsToColumns()”放在 onClick 事件中,但我的网站栏仍然没有更新为新值。当我刷新页面时,网站栏仍然具有旧值..我是为了工作而这样做的,这让我发疯了.. 控制台日志说:此功能对于与列表无关的字段不可用。
    • 啊,请将get_availableFields()函数替换为get_fields(),相信错误会消失(见更新答案)
    • 完成了..但现在它不再显示我的站点列了... :( ...我开始对此失去所有希望.....
    • 好的,现在它可以工作了。我在子站点的页面中添加了 Web 部件,因此通过这种方式更新上层内的列是不可能的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 2020-06-22
    相关资源
    最近更新 更多