A не определен внутри блока ‹aui:script›

Я пытаюсь расширить некоторые функции существующего портлета Liferay. В рамках этого я хотел бы использовать пользовательский интерфейс Alloy для изменения значения поля в портлете. Существует уже существующий блок <aui:script>, в котором я хотел бы определить свою пользовательскую функцию. Я пошел дальше и попытался использовать A.one('element'), но получаю сообщение об ошибке «A не определено». A.one() используется в другом месте в том же файле .jsp, но не в блоке <aui:script>, и работает так, как ожидалось.

Я пытался погуглить эту проблему, но безрезультатно. Одно из решений, которое я пробовал, заключалось в том, чтобы включить оператор «use» в блок элемента, но это сделало все функции в этом блоке неопределенными при вызове из jsp.

Что я имею в виду под оператором «использовать», так это:

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

Вот грубый план того, что я пытаюсь сделать:

<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>

person red_sky    schedule 03.07.2013    source источник
comment
я мало что знаю об AUI, но все же вы можете document.getElementsByName(title)[0].value получить значение элемента   -  person Laxman Rana    schedule 04.07.2013


Ответы (2)


<aui:script> выходные теги

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

только если вы предоставляете зависимости через атрибут use. Нравиться

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

Если вы это сделаете, у вас будет

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

как результат. Но в этом случае все функции, которые вы объявите внутри, не будут глобальными. Чтобы сделать их глобальным вызовом

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

внутри <aui:script/>

Также <aui:script use="aui-base"/> лучше, чем вызов AUI().use(function(A) {}) вручную, если у клиента может быть IE ‹= 7, который не работает корректно с AUI().use(). В случае IE 6,7 <aui:script use="aui-base> выведет AUI().ready('aui-base', function(A) {});, который будет работать в старых браузерах.

person GKlimov    schedule 04.07.2013
comment
Отличный и подробный ответ! - person jbalsas; 07.07.2013
comment
Я еще не тестировал это, но похоже, что это точно решит мою проблему. Огромное спасибо! - person red_sky; 08.07.2013

сообщение в блоге здесь дает хорошее введение в AUI. В частности, следующий отрывок из начала поста отвечает на ваш прямой вопрос:

How do you create a sandbox?

Simple:

AUI().use(function(A) {
   // Your code goes here  
});
person Alain Dresse    schedule 04.07.2013
comment
Я предположил, что тег ‹aui:script› создал для меня песочницу. Кроме того, A упоминается в другом месте в том же файле без явного вызова AUI().use... и работает так, как ожидалось. - person red_sky; 08.07.2013