buduję kątową aplikację, która jest uruchomiona jako zasobu sieciowego na dynamikę 2013.Dynamics 2013 podmiotów z dostępem do strony trudno przejść z widokiem iframe oparte
aplikacja działa za pomocą przycisku, który jest dodawany do commandContainer użyciu Workbench wstążka który wtedy przycisk wywołuje Xrm.Internal.openDialog
Wszystko to działa dobrze, dopóki nie chcą rozpocząć korzystanie z podmiotami odsłonięte przez Xrm.Page.Data
Zasadniczo mój przycisk działa w kontekście głównej stronie dynamiki jednak Podmioty są wewnątrz iframe, który opiera na stronie, w której się znajduję, ma inny identyfikator i nazwę.
Używając prostego selektora, nie mogę pobrać jego zawartości i zacząć używać Jednostek.
#crmContentPanel zawsze zawiera kilka elementów pływających zaczynających się od # contentIFrame0 na #contentIFrame (n) i nigdy nie wiadomo, która iframe jest tą z Elementami w niej zawartymi.
Jaka jest najlepsza praktyka, powiązany przepływ pracy z tworzeniem aplikacji w tym środowisku? W jaki sposób mogę łatwo i niezawodnie uzyskać dostęp do właściwej ramki, która zawiera elementy strony głównej i pracować z nimi.
Być może skrypt znajduje się w niewłaściwym miejscu i musi zostać wprowadzony do głównego obszaru zawartości, aby miał bezpośredni dostęp do prawidłowego Xrm? Jak mogę to osiągnąć?
Co więcej, gdy w końcu uda mi się uzyskać dostęp do tych danych, w jaki sposób mogę łatwo przekazać te dane do mojej aplikacji kątowej, która działa w oknie dialogowym, ponieważ z dokumentacji, którą przeczytałem, dialog jest dozwolony tylko w jednym ciągu znaków zapytania i musi nazwać dane. To nie wystarczy, aby moja aplikacja zaczęła używać $routeParams
. I nie sądzę, aby korzystanie z pamięci lokalnej lub sesji było przyjemną praktyką. Jakie jest prawidłowe podejście w tej sytuacji. Kod
próbki mojego przycisk skryptu:
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) { }
}
trochę bardziej szczegółowo
Kiedy wpisz następujące polecenie w konsoli mogę czasami (losowo) odczytać tytuł formularza:
$('#crmContentPanel').find("iframe#contentIFrame0")[0].contentWindow['Xrm'].Page.ui.get_formTitle();
Jednak ten sam kod z powiązanej funkcji zasobu internetowego nie może uzyskać dostępu do elementów iframe i błędów:
Can not Cannot read property 'contentWindow' of undefined.
Dlaczego element iframe nie jest dostępny za pośrednictwem skryptu zasobów i jak uzyskać dostęp do właściwego kontekstu i formularza tytuł/identyfikator.
Nie masz dostępu do jednostek CRM za pośrednictwem XRM. Kiedy piszesz JavaScript na samym formularzu, używasz 'Xrm.Page.Data' do manipulowania danymi w formularzu dla tego obiektu. Twój Webresource musi użyć identyfikatora, który przekazujesz, aby załadować niezbędne dane (zwykle wykonywane przez OData) i kontynuować od tego miejsca. – Nicknow
Cześć Nick, dziękuję, ale ten sam problem oznacza po prostu pobranie identyfikatora z Xrm, ponieważ skrypt działa w kontekście strony głównej, ale Xrm, który ma informacje o identyfikatorze formularza, znajduje się wewnątrz innego elementu iframe bez stałego identyfikatora na stronach w dynamika. Jak uzyskać spójny identyfikator? – XGreen