2012-10-15 14 views
8

Mam rozszerzenie do Tridion 2011 Content Manager Explorer, gdzie chcę wykonać określony fragment JavaScript tylko dla określonego widoku.Jak obsłużyć ładowanie widoku w CMX Tridion

zrobić to z następującego fragmentu javascript:

var onDisplayStarted = function() { 
    $evt.removeEventHandler($display, "start", onDisplayStarted); 

    if ($display.getView().getId() == "PublishPopup") { 
     ... 
    } 
}; 
$evt.addEventHandler($display, "start", onDisplayStarted); 

Ten kod działa dobrze w przeszłości, i to z pewnością wyzwala gdy PublishPopup otwiera i zapewnia mój kod wykonywany tylko w tym konkretnym widzenia.

Ale niestety czasami pojawia się następujący komunikat o błędzie w konsoli JavaScript podczas ładowania DashboardView:

Uncaught TypeError: Object # has no method 'getId'

Błąd nie powoduje żadnych problemów, najprawdopodobniej ponieważ błędy obsługi zdarzeń są prawidłowo obsługiwane przez Tridion użytkownika Struktura interfejsu użytkownika. Ale nadal wolałbym nie wyświetlać błędu w konsoli JavaScript.

rozumiem w jaki sposób wykryć, czy istnieje metoda getId:

if ($display.getView().getId && $display.getView().getId() == "PublishPopup") { 

Ale to tylko oznaczać, że kod nie wykonuje kiedykolwiek. I chociaż wydaje się, że teraz działa dobrze w wersji PublishPopup, wolałbym znać właściwy sposób obsługi tego typu sekwencji "mój kod powinien być wykonywany po inicjalizacji widoku".

Czy ktoś wie lepszy sposób radzenia sobie z tym?

Odpowiedz

5

Cóż, istnieją dwa różne widoki, które są ładowane w tym samym czasie - Dashboard Zobacz i Tridion Dashboard View. Widok Tridion Dashboard jest tym, co widzisz po kliknięciu karty SDL Tridion na pasku narzędzi wstążki. Rzeczywiście, ten widok nie ma metody getId (co jest dziwne, btw). Właśnie dlatego masz ten problem.

Niemniej jednak cała idea grup plików w pliku konfiguracyjnym polega na zminimalizowaniu ilości javascriptu, załadowaniu do każdego widoku i zminimalizowaniu niepotrzebnego przetwarzania javascript. Polecam więc podzielić plik javascript na części i załadować je tylko z konieczności.

+0

Dzięki za odpowiedź Borysa. Istnienie dwóch poglądów w istocie całkowicie wyjaśnia zachowanie, które widzę. Oznacza to również, że mogę bezpiecznie zignorować widok Tridion Dashboard. Ale ty (i John) masz rację, podział skryptu na dwa pliki byłby jeszcze lepszy. –

6

Czy masz kod w swojej konfiguracji, aby uwzględnić jedynie rozszerzenie w oknie podręcznym? Na przykład:

<cfg:extension target="Tridion.Web.UI.Editors.CME.Views.Popups.Publish"> 

Zazwyczaj używam tej konfiguracji, aby uruchamiać skrypt tylko w określonym widoku w cme.

Mój plik js wówczas wygląda następująco:

$evt.addEventHandler($display, "start", onDisplayStarted); 

function onDisplayStarted() { 

     $log.message("stuff here"); 
} 
+2

Hej John, dzięki za odpowiedź. Twoje podejście jest dokładnie takie, jak normalnie to robię. Ale w tym przypadku mam pojedynczy plik JavaScript, w którym tylko niektóre części muszą być ukierunkowane na 'PublishPopup'. Mógłbym podzielić JavaScript na dwa pliki i użyć konfiguracji do kierowania na każdy z nich, ale miałem nadzieję, że będzie również sposób na zrobienie tego w kodzie. Zdarzenie '$ display" start "' działa świetnie, po prostu nie rozumiem, dlaczego metoda getId nie jest jeszcze dostępna (i czy jest to gwarantowane tylko w 'DashboardView'). –

Powiązane problemy