2013-07-03 7 views
8

Próbuję rozszerzyć funkcjonalność istniejącego portletu Liferay. W ramach tego chciałbym użyć interfejsu użytkownika Alloy do modyfikowania wartości pola w portlecie. Istnieje już istniejący blok <aui:script>, w którym chciałbym zdefiniować moją funkcję niestandardową. Poszedłem do przodu i próbowałem używać A.one('element'), ale otrzymuję komunikat "A nie jest zdefiniowany". A.one() jest używany w innym miejscu tego samego pliku .jsp, ale nie w bloku <aui:script> i działa zgodnie z oczekiwaniami."Nie określono" w ramach <aui:script> blok

Próbowałem Googling ten problem bezskutecznie. Jednym z rozwiązań, które próbowałem, było włączenie instrukcji "use" w bloku elementów, ale spowodowało to, że wszystkie funkcje w tym bloku były niezdefiniowane po wywołaniu z jsp.

Co mam na myśli przez „użytkowania” oświadczenie jest taka:

<aui:script use="aui-node,aui-base"> 
    // ... script 
</aui:script> 

Oto szorstki zarys tego, co próbuję zrobić:

<aui:script> 
    function save(){ 
     // This is where I'm getting the 'A is not defined' error. 
     var titleNode = A.one('input[name=title]'); 

     if (titleNode) { 
      // do stuff with titleNode 
      var titleVal = titleNode.val(); 
      var titleSubstr = titleVal.substring(0, titleSubstr.lastIndexOf('/')); 
      titleNode.val(titleSubstr); 
     } 

     // other save-related code here 
    } 

    function otherFunction() { 
     // some other functionality 
    } 
</aui:script> 
+1

Nie wiem zbyt wiele o "AUI", ale nadal można "document.getElementsByName (" title ") [0] .value", aby uzyskać wartość elementu –

Odpowiedz

7

<aui:script> wyjścia tag

AUI().use(function(A) { 
} 

tylko jeśli podasz zależności poprzez atrybut use. Jak

<aui:script use="aui-base"> 
    // your code here 
</aui:script> 

Jeśli tak, musisz

<script type="text/javascript"> 
    AUI().use('aui-base', function(A) { 
     // your code here 
    } 
</script> 

wyniku. Ale w tym przypadku wszystkie deklarowane przez ciebie funkcje nie będą globalne. Aby uczynić je Światowego Apelu

Liferay.provide(window, 'functionName', function() { 
    // function body 
}); 

wewnątrz <aui:script/>

Również <aui:script use="aui-base"/> jest lepiej niż ręczne wywołanie AUI().use(function(A) {}) jeśli klient może mieć IE < = 7, który nie działa poprawnie z AUI().use(). W przypadku IE 6,7 <aui:script use="aui-base> wyświetli AUI().ready('aui-base', function(A) {});, który będzie działać w starych przeglądarkach.

+0

Świetna i szczegółowa odpowiedź! – jbalsas

+0

Nie testowałem jeszcze tego, ale wygląda na to, że to dokładnie rozwiąże mój problem. Wielkie dzięki! –

0

blog post here daje dobre wprowadzenie do AUI. W szczególności następujący fragment z początku postu odpowiedzi na swoje bezpośrednie pytanie:

How do you create a sandbox? 

Simple: 

AUI().use(function(A) { 
    // Your code goes here 
}); 
+0

Założono, że tag ustawił dla mnie sandbox. Również "A" odwołuje się gdzie indziej w tym samym pliku bez jawnego wywoływania 'AUI(). Use' ... i działa zgodnie z oczekiwaniami. –

Powiązane problemy