【发布时间】:2013-03-27 08:40:02
【问题描述】:
如何使用 CRM2011 中的插件从适当的 Web 资源运行 JavaScript 函数。
我在 Internet 上找不到任何信息。大部分资源描述了如何从 JS 触发插件,但不是相反。
这是将注释复制到描述字段的 JS 代码。 单击保存时。您可以看到数据正确显示在描述字段中。但是,如果您按保存并关闭并再次打开表单,说明字段将为空。 我认为这样做的原因是 JS 在安全事件之后执行,但后来的测试发现它是错误的。有人能指出这个 JS 代码中的错误导致数据没有保存吗? 或者建议如何编写一个插件,该插件从相关实体中检索数据并将其写入表单中的字段。谢谢
function copyNotes()
{
// CLEAR DESCRIPTION FIELD
alert("JS");
Xrm.Page.getAttribute("description").setValue('');
// GET ID OF THE CASE AND CLEAN IT AND GET URL for oData stuff
//THEN CALL RETRIEVE FUNCTION
var caseID = Xrm.Page.data.entity.getId();
caseID = caseID.replace('{', '').replace('}', '');
var oDataPath = Xrm.Page.context.getServerUrl() + "/xrmservices/2011/organizationdata.svc";
ODataPath = Xrm.Page.context.getServerUrl() + "/XRMServices/2011/OrganizationData.svc";
retrieveRecord(caseID);
}
// CREATE AN HTTP REQUEST AND SEND IT
function retrieveRecord(Id) {
var retrieveReq = new XMLHttpRequest();
retrieveReq.open("GET", ODataPath + "/AnnotationSet?$filter=ObjectId/Id" + " eq (guid'" + Id + "')", true);
retrieveReq.setRequestHeader("Accept", "application/json");
retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
retrieveReq.onreadystatechange = function() {
// THIS HANDLES A CALLBACK
retrieveReqCallBack(this);
};
retrieveReq.send();
}
function retrieveReqCallBack(retrieveReq) {
if (retrieveReq.readyState == 4 /* complete */ )
{
if (retrieveReq.status == 200) {
//Success
var retrieved = this.parent.JSON.parse(retrieveReq.responseText).d;
// ITERATE THROUGH THE NOTES FOR THIS CASE
for (var i = 0; i < retrieved.results.length; i++) {
// IF IS AN EMPTY FIELD ADD 'case details:'
if (Xrm.Page.getAttribute("description").getValue() == null || Xrm.Page.getAttribute("description").getValue() == 'null') {
Xrm.Page.getAttribute("description").setValue('Case details:');
}
// BOF PARSE DATE
var date = retrieved.results[i].CreatedOn;
date = new Date(parseInt(date.replace("/Date(", "").replace(")/", ""), 10));
// EOF PARSE DATE
var newtext = "--------------------\r\n" + "Created by: " + retrieved.results[i].CreatedBy.Name + " - " + date + "\r\n" + retrieved.results[i].NoteText + "\r\n--------------------\r\n";
var text = Xrm.Page.getAttribute("description").getValue() + "\r\n" + newtext;
Xrm.Page.getAttribute("description").setValue(text);
}
}
}
}
【问题讨论】:
-
插件需要从服务器更新客户端上的 javascript 是为了什么?
-
插件需要从 js web 资源运行一个函数。问题是我需要让这个函数在 onSave 事件之前运行,我不知道怎么做,我认为这是不可能的。我唯一能想到的就是编写一个可以运行 JS 脚本的插件。否则我觉得我必须在插件中复制 js 函数的行为。
-
为什么你的javascript不能在表单的OnSave事件中运行?
-
可以的。但正如我所见,它甚至会在 onSave 之后触发。首先表单保存并且JS运行。我需要在表单保存之前执行它。 Run onLoad 对我来说也不方便。实际上,我需要在更改与之相关并嵌入表单中的另一个实体时运行它,但该实体是系统实体,我无法修改它或在该实体中特定字段的更改时分配 JS
-
OnSave Javascript 事件在实际数据库更新/插件执行发生之前运行。
标签: javascript plugins call dynamics-crm-2011