我有一些自定义脚本,它将最新的音符值添加到隐藏的文本字段,隐藏的文本字段随后显示在我的实体的一个视图中。当我在添加新笔记后单击“保存并关闭”时,由于表单未刷新,因此视图不会使用最新笔记进行更新。如果用户点击“保存并关闭”,我该怎么办才能刷新表单?
编辑:@Arthur由于某些原因,我无法在您的帖子中添加评论。无论如何,我按照你的建议尝试了。当我试图点击"保存"单独,表格刷新,返回的值是真的,所以国旗被绊倒了。但是,当我尝试使用"保存并关闭时#34;表格没有刷新,因此国旗没有被绊倒。这使我假设我必须刷新表单才能让视图更新。
编辑2:这是检索信息的代码。
function GetLatestNote() {
var req = new XMLHttpRequest();
req.open("GET", encodeURI(Xrm.Page.context.getClientUrl() + "/XRMServices/2011/OrganizationData.svc/AnnotationSet?" + "$select=NoteText&$filter=ObjectId/Id eq guid'" + Xrm.Page.data.entity.getId() + "'&$orderby=CreatedOn desc&$top=1"), true);
req.setRequestHeader('Accept', 'application/json');
req.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
req.onreadystatechange = function() {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 200) {
var note = JSON.parse(req.responseText).d;
var results = note.results;
var NoteText = results[0].NoteText;
var newnote = Xrm.Page.getAttribute("new_lastcomment").setValue(NoteText);
}
}
};
req.send();
}
new_lastcomment是隐藏字段。我现在要做的是,如果用户单击“保存并关闭”,则停止保存事件,重新加载页面,并使用脚本关闭表单。以下是该功能的代码:
function save(executionObj) {
var savestate = executionObj.getEventArgs.getsavemode();
if (savestate == 2) {
executionObj.getEventArgs().preventDefault();
window.location.reload(true);
Xrm.Page.data.entity.save("saveandclose");
}
}
当我测试此代码时会发生什么,但是当我尝试保存并关闭时,我收到以下消息:
此字段的自定义事件出现错误。字段:crmForm,事件:onsave,错误:对象不支持属性或方法' getsavemode'
然而,一旦我点击确定,脚本就会关闭,视图会根据我的需要进行更新!但现在有一个问题,因为每次我点击保存并关闭时,我都不希望弹出这个错误信息。为了在这里添加更多深度,我将这两个函数作为onsave事件运行,对于save函数,我将"传递执行上下文作为第一个参数"检查。我试图在没有选中此框的情况下运行它,并得到一个错误,该值未定义,但再一次,在我单击确定后,表单将关闭并且视图已更新。为什么这个错误现在出现了?
编辑:@Arthur表单现在正在刷新,但我仍然收到与之前相同的错误消息。
答案 0 :(得分:2)
通常是" isdirty"只要表单发生更改,就会触发标志。
此标志让CRM知道对相关表单进行了修改,并确保显示"有未保存的更改"对话框。
我的猜测是,当您更新文本框时,此标志不会被触发。
如果你把
console.log(Xrm.Page.data.entity.getIsDirty())
在你的javascript中查看生成的代码,是真的还是假的?
如果它是假的,你需要使用
设置脏标志Xrm.Page.data.setFormDirty()
编辑:我不再认为这是问题所在。参见下文。
设置文本框的值后,尝试执行以下操作:
Xrm.Page.data.refresh(save);
应该保存它,这样保存和关闭按钮也不必。
答案 1 :(得分:1)
在做了一些研究后,我发现了问题所在。
在我的函数GetLatestNote()中,我正在异步地从note字段中检索数据。这可能导致控件在执行代码之前返回给用户并且在表单上填充了字段。因此,当我点击保存并关闭时,这导致信息没有被带过来。
以下是同步执行JSON代码的代码,适用于将来可能需要的代码。像魅力一样工作:)
function GetLatestNote() {
var req = new XMLHttpRequest();
req.open("GET", encodeURI( Xrm.Page.context.getClientUrl() + "/XRMServices/2011/OrganizationData.svc/AnnotationSet?" + "$select=NoteText&$filter=ObjectId/Id eq guid'"+Xrm.Page.data.entity.getId()+"'&$orderby=CreatedOn desc&$top=1"), false);
req.setRequestHeader('Accept', 'application/json');
req.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
req.send(null);
var note = JSON.parse(req.responseText).d;
var results = note.results;
var NoteText = results[0].NoteText;
var newnote = Xrm.Page.getAttribute("new_lastcomment").setValue(NoteText);
}
@Arthur非常感谢你帮助我。我真的很感激它!