zab*_*bby 1 javascript refresh business-process dynamics-crm-2013
我目前拥有CRM 2013内部部署的开发环境.在我的自定义实体中,运行以下JavaScript代码:
function UpdateBPF() {
var requests = [];
requests.push(Xrm.Page.getAttribute('description').setRequiredLevel('none'));
requests.push(Xrm.Page.getAttribute('categoryid').setRequiredLevel('none'));
requests.push(Xrm.Page.getAttribute('priority').setRequiredLevel('none'));
requests.push(Xrm.Page.getAttribute('initialtype').setValue(1));
requests.push(Xrm.Page.data.save());
requests.push(event.returnValue = false);
$.when.apply(undefined, requests).always(function () {
Xrm.Page.data.setFormDirty(false);
RefreshForm();
});
};
function RefreshForm() {
Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId());
};
Run Code Online (Sandbox Code Playgroud)
我正在做的事情:
切换选项集后我的代码正在做什么:
为什么我将大部分步骤推入请求变量?
什么有效:
CRM 2013在线问题:
我试过保存的内容:
Xrm.Page.data.save()Xrm.Page.data.entity.save()我尝试刷新的内容:
Xrm.Page.data.refresh()Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())Xrm.Utility.openEntityForm("service_ticket", Xrm.Page.data.entity.getId(), null)var url = Xrm.Page.context.getClientUrl();
window.open(url + "/main.aspx?etn=ticket&pagetype=entityrecord&id=" + Xrm.Page.data.entity.getId() + "&newWindow=false", "_blank", null, false);当我调试时,一步一步地通过顶部发布的代码,它获得当时的.when,.apply和.always但SKIPS内部的一切.我认为这总意味着它总是运行...
当我尝试:
Xrm.Page.data.save().then(
function () {
alert('Save worked, refresh');
Xrm.Page.data.refresh();
},
function () {
alert('Save failed!');
}
);
Run Code Online (Sandbox Code Playgroud)
单步执行代码就可以实现保存.但是在击中之后,它将SKIPS内部的所有内容然后IE(我主要测试的是因为Chrome似乎工作......),完全崩溃了.错误没有完全弹出,更多的是警告说"IE已经停止工作".
我在StackOverflow中看到过1个类似的问题,但没有接受的答案或答案对我来说根本不起作用.前两个段落之前的Xrm.Page.data.save()函数是其中一个答案的样本.超级简单的样品,易于遵循并逐步进行测试,结果无变化.
我也用谷歌搜索(我最好的朋友)甚至是我的问题.另一个网站上的另一个帖子,我相信在微软网站上,根本没有回复.根据所写的内容,我假设它与StackOverflow帖子的人员相同.
任何对问题的洞察,无论是我的代码还是其他东西,都非常感谢.
tl; dr保存和刷新JavaScript不适用于CRM 2013 Online
我最终做的是在Xrm.Page.data.save之前有一个setTimeout.似乎在字段更改之后和我的JavaScript之前直接发生了某些事情.它可能是业务规则(但我最初已将它们停用,因此有可能不是这样).
无论哪种方式,我为解决我的问题所做的是在短暂的超时内包含save函数,然后使用Xrm.Utility.openEntityForm来"刷新"整个页面,因为我宁愿不使用不支持的
Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())
Run Code Online (Sandbox Code Playgroud)
以下是我使用的代码段:
setTimeout(function () {
Xrm.Page.data.save().then(
function () {
var id = Xrm.Page.data.entity.getId();
var entityLogicalName = Xrm.Page.data.entity.getEntityName();
Xrm.Utility.openEntityForm(entityLogicalName, id);
},
function () {
alert('Save failed! Please refresh the form.');
});
}, 500);
Run Code Online (Sandbox Code Playgroud)
我在保存新创建的记录后获得记录的ID.超出超时或保存之前会导致打开一条新记录(基本上是Save + New).
如果有更有效的方法可以解决这个问题,请告知我,我会选择你的答案(如果有效)作为正确答案.
编辑:
以下代码实际上是一个更好的版本.之前的代码我做了Save and Save&Close,导致Save发生两次,这搞砸了我的一些不同项目的逻辑
setTimeout(function () {
var id = Xrm.Page.data.entity.getId();
var entityLogicalName = Xrm.Page.data.entity.getEntityName();
Xrm.Utility.openEntityForm(entityLogicalName, id);
}, 500);
Run Code Online (Sandbox Code Playgroud)
在这里,openEntityForm是在关闭之前保存记录并再次打开自己,最接近我可以进入保存和刷新.
| 归档时间: |
|
| 查看次数: |
9835 次 |
| 最近记录: |