URL к контроллеру / действию во внешнем файле Javascript - PullRequest
0 голосов
/ 19 марта 2012

У меня есть форма, которая обрабатывает редактирование модели предметной области (A). Эта модель домена также hasMany другие модели домена (B). Поэтому, чтобы добавить новые B в A, я хотел реализовать пользовательскую функцию AJAX, которая отправляет параметры некоторых полей ввода в контроллер.

Для этого я создал следующий GSP:

<g:form>
<!-- other stuff concerning entity A -->
    <p>Add B to A</p>
    <input type="text" id="bName" /> <input type="text" id="bSomeProperty" <a href="#" id="addB">Add</a>
</g:form>

И добавил следующий фрагмент Javascript в мой main.js, который загружается плагином resources.

$("#addB").click(function() {
    $.ajax({
        url: '', // controller: a, action: addB
        dataType: 'json',
        data: {
            bName: $('#bName').val(),
            bSomeProperty: $('#bSomeProperty').val(),
        }
    });
});

Итак, вопрос: как я могу получить URL, который указывает на текущий контроллер и действие addB? Я не хочу жестко кодировать его или использовать относительный путь, если это возможно - поскольку Grails фактически предоставляет некоторые методы для получения ссылки.

Использование remoteFunction в Javascript мне не помогло, так как я использую jQuery. Кажется, что оба не работают хорошо вместе.

Я также нашел эту статью в блоге (http://alexduan.com/2011/02/17/grails-jquery-and-ajax/) о Grails, jQuery и AJAX. Он использует переменную в части javascript. К сожалению, переменная contextPath не анализируется, поскольку Javascript не находится на странице GSP но во внешнем файле.

Что я могу сделать?

Параметры:

  • Поместите фрагмент Javascript в тег g:javascript на странице (несколько уродливо, потому что он несколько встроен)
  • Использовать относительный URL (не очень надежный)
  • Получите remoteFunction для работы (как это сделать с jQuery?)
  • что-нибудь еще?

1 Ответ

0 голосов
/ 21 марта 2012

Я использую ваш первый вариант в своих проектах: я загружаю подмножество всех моих отображений в глобальный объект javascript myapp.urls, такой что

myapp.urls['mappingName'] = url

2 проблемы возникают:

  • Вы должны выбрать URL, которые хотите показать, так как они становятся общедоступными

  • веб-сканеры (например, GoogleBot) будут переходить по этим ссылкам, если вы не создали для этого файл robots.txt.

Итак, для улучшения этого решения я встроил в base64 встроенный вызов, поэтому получаю что-то похожее на это:

myapp.urls=eval(base64_decode('gYW55IGNhcm5hbCBwbGVhc3VyZS4=='));

Это не идеально, но работает.

...