Добавить метод, который будет доступен во всех представлениях - PullRequest
0 голосов
/ 16 марта 2012

Мне бы хотелось, чтобы в моем приложении был доступен метод для всех видов.

Я хотел бы иметь возможность совершать вызовы следующим образом:

<span>${ getDynamicText() }</span>

Наиболее очевидные способы (мне), чтобы реализовать это:

  1. Вызовите метод в контроллере и передайте его в представление.
  2. Сделайте метод статическим в некотором классе Util и вызовите его изcode ${ UtilClass.getDynamicText() }
  3. Использование метапрограммирования для того, чтобы каким-то образом сделать метод доступным для всех представлений.

Преимущество # 3 состоит в том, что изменение должно быть сделано только в одном месте.,# 1 должен быть сделан в каждом действии контроллера;и # 2 потребуется импорт на каждой странице просмотра, которая хочет использовать метод.

Так есть ли способ добавить метод, который будет доступен для всех представлений в моем приложении?

Признаюсь, я не очень подробно знаю, как файлы .gsp обрабатываются за кулисами, поэтому, возможно, у них нет соответствующего класса, и поэтому ими нельзя манипулировать,Ссылки на хорошие статьи / документы получат дополнительную хорошую карму.

Ответы [ 4 ]

3 голосов
/ 16 марта 2012

GSP скомпилированы в классы, расширяющие org.codehaus.groovy.grails.web.pages.GroovyPage, так что вы можете добавить методы к этому метаклассу, и они будут доступны для всех GSP. Лучшее место для этого - BootStrap.groovy (или закрытие doWithDynamicMethods плагина):

import org.codehaus.groovy.grails.web.pages.GroovyPage

class BootStrap {

   def init = { servletContext ->
      GroovyPage.metaClass.getDynamicText = { ... }
   }
}
2 голосов
/ 16 марта 2012

Рекомендованный способ повторного использования функциональности в GSP - это определить его как тег, например,

class MyTagLib {

  static namespace = 'my'

  def dynamicText = {attrs ->
    out << 'not very dynamic'
  }
}

Затем этот тег можно вызвать в GSP с помощью:

<my:dynamicText/>
1 голос
/ 16 марта 2012

4-й способ: создайте класс / сервис с методом .getDynamicText и поместите его intance в запрос на before filter (request.setAttribute('x', myDynamicTextGeneratorObject))

Теперь вы можете использовать x.dynamicText в любом GSP

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

Вот как я бы это сделал:

  • Добавьте новый класс в папку контроллеров, содержащую ваш метод
  • Выполните grails install-templates
  • Перейдите кшаблоны: \src\templatesscaffolding
  • Добавьте часть расширения к шаблону контроллера: class ${className}Controller extends NewController
  • заново сгенерируйте ваши контроллеры

Теперь вы можете использовать методв каждом классе и gsp.

...