【问题标题】:Button visible based on team基于团队可见的按钮
【发布时间】:2016-12-13 06:37:19
【问题描述】:

按钮应该可见基于团队。示例如果“测试团队”的登录用户部分,“测试按钮”应该启用。如果不禁用。我正在使用 webapi。但它给出的是空值。任何建议??

 function GetUserTeam() {
var clientUrl1 = Xrm.Page.context.getClientUrl();
var oDataPath1 = clientUrl1 + "/api/data/v8.0/";
var req1 = new XMLHttpRequest();
   try {

    var strTest = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>" +
                    "  <entity name='team'>" +
                    "    <attribute name='name' />" +
                    "    <attribute name='businessunitid' />" +
                    "    <attribute name='teamid' />" +
                    "    <attribute name='teamtype' />" +
                    "    <order attribute='name' descending='false' />" +
                    "    <filter type='and'>" +
                    "      <condition attribute='teamtype' operator='eq' value='0' />" +
                    "    </filter>" +
                    "    <link-entity name='teammembership' from='teamid' to='teamid' visible='false' intersect='true'>" +
                    "      <link-entity name='systemuser' from='systemuserid' to='systemuserid' alias='ab'>" +
                    "        <filter type='and'>" +
                    "          <condition attribute='systemuserid' operator='eq-userid' />" +
                    "        </filter>" +
                    "      </link-entity>" +
                    "    </link-entity>" +
                    "  </entity>" +
                    "</fetch>";
    req1.open("GET", oDataPath1 + "teams?fetchXml=" + encodeURI(strTest), true);
    req1.setRequestHeader("Accept", "application/json");
    req1.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req1.setRequestHeader("OData-MaxVersion", "4.0");
    req1.setRequestHeader("OData-Version", "4.0");
    req1.onreadystatechange = function () {
        if (this.readyState == 4) {
            // debugger;
            req1.onreadystatechange = null;
            if (this.status == 200) {
                var reqResults = JSON.parse(this.response).value;
                if (reqResults != null && reqResults.length > 0) {
                    if ("TestTeam"==reqResults.length[i].name){return true;}

                else{return false;}
                }
                    }//End of for

                }//En of IF

            }

            else {

                var error = JSON.parse(this.response).error;
                alert(error.message);
            }

        }

    };      
    req1.send();              

}
catch (e) {

    alert(e);

}

}

【问题讨论】:

  • 这当然是可以在 Dynamics 中完成的。显示给出空值的代码。
  • 我得到了返回值。但是按钮不是禁用/启用,当我使用功能区按钮调用这个函数时。

标签: dynamics-crm


【解决方案1】:

感谢您发布示例代码。它有一些语法错误,但我认为这是因为您为帖子编辑了它。例如,for 循环不存在并且括号丢失。

  1. 请求是异步的。从您的方法返回未定义。您要么希望将 XMLHttpRequest 更改为同步运行(出于用户体验原因通常不推荐),要么在有结果时传入回调以调用。这里我添加了 onSuccess 和 onError。 onSuccess 将 true/false 作为参数,即是否找到了 TestTeam。

  2. 在你的 for 循环中,你有 reqResults.length[i],你可能指的是 reqResults[i]。同样,这可能只是发布编辑的问题。

因此,如果 TestTeam 是用户的团队之一,则此代码将调用值为 true 的 onSuccess。如果不是,则为 false。或者如果发生错误,它将调用 onError。您可以进行编辑以构建一组要传回的团队等。或者您可以编辑 .open() 调用,使其运行 synchronously 并且不使用回调。

function GetUserTeam(onSuccess, onError) {
    var clientUrl1 = Xrm.Page.context.getClientUrl();
    var oDataPath1 = clientUrl1 + "/api/data/v8.0/";
    var req1 = new XMLHttpRequest();
    try {

        var strTest = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>" +
                        "  <entity name='team'>" +
                        "    <attribute name='name' />" +
                        "    <attribute name='businessunitid' />" +
                        "    <attribute name='teamid' />" +
                        "    <attribute name='teamtype' />" +
                        "    <order attribute='name' descending='false' />" +
                        "    <filter type='and'>" +
                        "      <condition attribute='teamtype' operator='eq' value='0' />" +
                        "    </filter>" +
                        "    <link-entity name='teammembership' from='teamid' to='teamid' visible='false' intersect='true'>" +
                        "      <link-entity name='systemuser' from='systemuserid' to='systemuserid' alias='ab'>" +
                        "        <filter type='and'>" +
                        "          <condition attribute='systemuserid' operator='eq-userid' />" +
                        "        </filter>" +
                        "      </link-entity>" +
                        "    </link-entity>" +
                        "  </entity>" +
                        "</fetch>";
        req1.open("GET", oDataPath1 + "teams?fetchXml=" + encodeURI(strTest), true);
        req1.setRequestHeader("Accept", "application/json");
        req1.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        req1.setRequestHeader("OData-MaxVersion", "4.0");
        req1.setRequestHeader("OData-Version", "4.0");
        req1.onreadystatechange = function () {
            if (this.readyState == 4) {
                // debugger;
                req1.onreadystatechange = null;
                    if (this.status == 200) {
                        var returnValue = false;
                        var reqResults = JSON.parse(this.response).value;
                        if (reqResults != null && reqResults.length > 0) {
                            for(var i = 0, j = reqResults.length; i < j; i++){
                                if ("TestTeam" == reqResults[i].name){
                                    returnValue = true;
                                    break;
                                }
                            }
                        }

                        // Call the handler
                        onSuccess && onSuccess(returnValue);
                    }
                    else {
                        var error = JSON.parse(this.response).error;
                        alert(error.message);
                        onError && onError(error);
                    }
            }
        };      
        req1.send();
    }
    catch (e) {
        alert(e);
        onError && onError(e);
    }
}

【讨论】:

  • 抱歉重播晚了。非常感谢,我刚刚修改了你的代码。现在我可以隐藏/显示按钮了。请找到以下几点。我已经声明了一个全局变量 .like var teamValu=false;然后我写了单独的函数[usehasTeam]。我正在检查teamvalue是null还是未定义,setTimeout(usehasTeam,500)。如果不是null,我在功能区启用规则中调用了“usehasTeam”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 2020-03-17
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多