Javascript Dynamics 2013使用基于iframe的视图很难访问页面实体

Javascript Dynamics 2013使用基于iframe的视图很难访问页面实体,javascript,angularjs,dynamics-crm-2013,Javascript,Angularjs,Dynamics Crm 2013,我正在构建一个angular应用程序,它作为Dynamics 2013上的web资源运行 应用程序使用一个按钮运行,该按钮使用Ribbon workbench添加到commandContainer,然后该按钮调用Xrm.Internal.openDialog 在我想开始使用由Xrm.Page.Data 基本上,我的按钮在dynamics主页的上下文中运行,但是实体位于iframe中,基于我所在的页面,iframe具有不同的Id和名称 因此,使用一个简单的选择器,我无法获取它的contentWin

我正在构建一个angular应用程序,它作为Dynamics 2013上的web资源运行

应用程序使用一个按钮运行,该按钮使用Ribbon workbench添加到commandContainer,然后该按钮调用
Xrm.Internal.openDialog

在我想开始使用由
Xrm.Page.Data

基本上,我的按钮在dynamics主页的上下文中运行,但是实体位于iframe中,基于我所在的页面,iframe具有不同的Id和名称

因此,使用一个简单的选择器,我无法获取它的contentWindow并开始使用实体

#crmContentPanel中总是包含很少的iframe,从#contentIFrame0到#contentIFrame(n),我永远不知道哪个iframe中包含实体

在这种环境下开发应用程序的最佳实践是什么?如何轻松可靠地访问包含主页实体的正确框架并使用它们。

也许脚本位于错误的位置,需要注入到主内容区域,以便直接访问正确的Xrm?我怎样才能做到这一点

此外,一旦我最终能够访问这些数据,我如何能够轻松地将这些数据传递给我的angular应用程序,该应用程序在对话框中运行,因为从我阅读的文档中可以看出,该对话框只允许使用1个查询字符串param,并且它必须被称为data。这还不足以让我的应用程序开始使用
$routeParams
。我不认为使用本地或会话存储是一种很好的做法。在这种情况下,正确的方法是什么

我的按钮脚本的示例代码:

function runSendSender() {

    // Content Iframe Entity data:
    var contentFrameXrm = $('#crmContentPanel')
                       .find("iframe#contentIFrame0...n")[0]
                       .contentWindow['Xrm'];

    // even if above selector was consistent across pages
    // I need to send over much more than this one Id :(
    var data = contentFrameXrm.Page.data.entity.getId();

    var src = "/WebResources/concep_/ConcepDynamicsApp/ConcepDynamicsApp.html?data=" + data;
    var DialogOptions = new Xrm.DialogOptions();
    DialogOptions.width = 800;
    DialogOptions.height = 500;
    Xrm.Internal.openDialog(src, DialogOptions, null, null, CallbackFunction);

    function CallbackFunction(returnValue) { }
}
再详细一点

当我在控制台中键入以下内容时,有时我可以(随机)阅读表单的标题:

$('#crmContentPanel').find("iframe#contentIFrame0")[0].contentWindow['Xrm'].Page.ui.get_formTitle();
但是,来自相关web资源功能的相同代码无法访问iframe,并且出现以下错误:

Can not Cannot read property 'contentWindow' of undefined.

为什么不能通过资源脚本访问iframe?我如何才能访问正确的上下文和表单标题/id。

我通常会将以下JavaScript文件添加到需要访问CRM特定操作/信息的自定义WebResource的标题中:

<script src="ClientGlobalContext.js.aspx" type="text/javascript"></script>

请注意
窗口。父项
前缀。

记录Id可以通过功能区本身作为参数发送到
runSendSender
。只需在函数调用中添加适当的
crmpareter
()

在您的情况下,参数值将是
FirstPrimaryItemId
(“为正在查看的记录提供一个GUID标识符作为字符串。”)

在那之后,你会像这样改变你的函数

function runSendSender(recordId) { ... }
另外,远离内部:要在对话框中打开web资源,您应该使用(link提供有关将参数传递给资源而不是
数据的信息)


您没有通过XRM访问CRM实体的权限。在表单本身上编写JavaScript时,可以使用
Xrm.Page.Data
来操作该实体表单上的数据。您的Webresource需要使用您传递给它的id来加载必要的数据(通常通过OData完成),然后从那里开始。你好,Nick,谢谢,但同样的问题是,当脚本在顶部页面的上下文中运行时,仅从Xrm获取Id,但具有表单Id信息的Xrm位于另一个iframe中,在dynamics中没有固定的跨页面Id。如何一致地获取id?
function runSendSender(recordId) { ... }
Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height)