当前位置: 首页>>技术问答>>正文


使用ECMA脚本获取特定属性包

webfans 技术问答 , , , 去评论

问题描述

我试图从特定的属性包中获取一个键/值对,但无法找到有关如何获取属性包的任何文档或示例代码。目前我似乎只能抓住allProperties。这是我的代码:

    <CommandUIHandler
          Command="FCS.Intake.Tab.Reports.TL"
          CommandAction="javascript:
          function getWebProperty() {

        var ctx = new SP.ClientContext.get_current();
        var web = ctx.get_site().get_rootWeb();
        this.props =  web.get_allProperties();

        ctx.load(web);

        ctx.executeQueryAsync(Function.createDelegate(this, gotProperty), Function.createDelegate(this, failedGettingProperty));
    }

    function gotProperty() {
      window.location.href = this.props.get_item('PropertyKey1');       
    }

    function failedGettingProperty() {
        alert('failed');
    }
  getWebProperty();"
        />

这不起作用,因为键/值对位于属性包中而不是站点属性。

有谁知道如何使用ECMA脚本获取特定的属性包?

最佳解决方案

尝试加载this.props

function getWebProperty() {

    var ctx = new SP.ClientContext.get_current();
    var web = ctx.get_site().get_rootWeb();
    this.props =  web.get_allProperties();

    ctx.load(web);
    ctx.load(this.props); //need to load the properties explicitly
    ctx.executeQueryAsync(Function.createDelegate(this, gotProperty), Function.createDelegate(this, failedGettingProperty));
}    

然后在您的成功函数中,您需要通过 get_fieldValues()运行属性包的值,然后通过索引器访问该属性的键。

function gotProperty() {
    var myPropBag = this.props;
    alert(myPropBag.get_fieldValues()["allowdesigner"]); //returns the value of the key allowdesigner
}

Firefox的firebug将允许你这样做

console.log(myPropBag.get_fieldValues());

这会将所有属性包密钥打印到控制台窗口。

谢谢, – @ SharePointAP

次佳解决方案

实际上,您可以将特定属性作为mentioned here获取。

诀窍是加载,而不是Web,但对象从”web.get_allProperties”返回。

然后,您只需要调用.get_item('name_of_the_prop_you_want_to_retrieve')

希望能帮助到你

第三种解决方案

由于这里没有回答覆盖实际问题的答案 – “使用ECMA脚本获取特定的属性包”这里有一些代码可以做到这一点:

ExecuteOrDelayUntilScriptLoaded(getWebProperties, "sp.js");
var webProperties;
function getWebProperties() {
    var clientContext = new SP.ClientContext.get_current();
    webProperties = clientContext.get_web().get_allProperties();
    //get a single property
    clientContext.load(webProperties, 'FollowLinkEnabled');
    // get multiple properties
    // clientContext.load(webProperties, 'FollowLinkEnabled');
    // clientContext.load(webProperties, '__PublishingFeatureActivated');
    clientContext.executeQueryAsync(Function.createDelegate(this, this.getWebPropertiesSucceeded), Function.createDelegate(this, this.onQueryFailed));
}

function getWebPropertiesSucceeded() {
    var allProps = webProperties.get_fieldValues();
    for (var prop in allProps) {
        console.info(prop + ' : ' + allProps[prop]);
    }
}

function onQueryFailed(args, sender) {
    debugger;
    //handle errors here
}

这是请求提到的2个属性时的结果:

javascript,client-object-model,property,sharepoint

为什么我要求单个值而不是整个包?

简单地减少网络流量并提高性能。

第四种方案

我无法找到获取特定属性包的方法,但是使用来自Aaron帖子的信息(加载this.props),可以将属性包作为xml字符串获取,解析该xml并获取他们正在寻找的特定值对于。我是这样做的:

function getWebProperty(propKey, propBagName) {          
  var ctx = new SP.ClientContext.get_current();
  var web = ctx.get_site().get_rootWeb();
  this.props =  web.get_allProperties();
  this.propKey = propKey;
  this.propBagName = propBagName;
  ctx.load(web);
  ctx.load(this.props);
  ctx.executeQueryAsync(Function.createDelegate(this, gotProperty), Function.createDelegate(this, failedGettingProperty));
}

function gotProperty() {
      var myPropBag = this.props;
      // Grab specific property bag as xml
      var myPropBagXML = myPropBag.get_fieldValues()[this.propBagName];        
      var parser = new DOMParser();
      var xmlDoc = parser.parseFromString(myPropBagXML, 'text/xml');
      xmlDoc.async = 'false';
      var propValue = xmlDoc.getElementsByTagName(this.propKey)[0].childNodes[0].nodeValue;
      alert(propValue);                
}

function failedGettingProperty() {
    alert('failed');
}

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2082.html,转载请务必附带本地址声明。