Как заставить Ember.js вести себя с именами контроллеров Grails?

Grails довольно мощный и позволяет вам превратить ваши доменные объекты в JSON с помощью одного оператора (object as JSON). К сожалению, этого недостаточно для взаимодействия с Ember.js по нескольким причинам.

Как я могу заставить Grails хорошо играть с Ember.js?

2 ответа

Хороший вопрос, сам!

Ember.js и его ниндзюцу auto-AJAX-in-browser-data-store ожидают, что URL будет выглядеть определенным образом, а JSON будет выглядеть определенным образом. Благодаря тому, как работает каждый инструмент, легче вносить соответствующие изменения в обе части уравнения!

Что обеспечивает Grails

Для предметного класса MyCoolDomainClass с контроллером MyCoolDomainClassController, Grails хочет предоставить URL /app/myCoolDomainClass, Если вы настроили контроллер так, чтобы он содержал что-то вроде:

def index() { render MyCoolDomainClass.list() as JSON }

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

[{ id: 1, name: "Bob"}, {id: 2, name: "Sally"}]

Что хочет Эмбер

В Ember.js вы можете создать модель с такими же свойствами. Используя ember-dataВы можете легко подключить хранилище данных в браузере к своему бэкэнду. К сожалению, то, что хочет Ember.js, отличается. Ожидает URL /my_cool_domain_class предоставить данные:

{ mycooldomainclass: [ { id: 1, name: "Bob"}, {id: 2, name "Sally"}] }

примиряющий

ОБНОВЛЕНИЕ: я создал ember-data-grails Сделайте репозиторий на Github, который позаботится обо всех этих модификациях для вас, и покажет, как сделать контроллер, который прекрасно работает!

Я начинаю с emberjs, работаю два года в Grails 1.3.7, так что вот что я сделаю, чтобы вы могли получить:

{ mycooldomainclass: [ { id: 1, name: "Bob"}, {id: 2, name "Sally"}] }

Это достаточно просто:

def c = Product.createCriteria()
def products = c.list{
    //your criteria
}
res = products.collect {a ->
  return [id:a.id, name:a.name, price:a.price, categoryname: a.category.name]
}

response.setHeader( "Pragma", "no-cache" )
response.setHeader( "Cache-Control", "no-cache" )
response.setDateHeader( "Expires", 0 )
render(contentType: 'text/json') {[
    'mycooldomainclass': res
]}
Другие вопросы по тегам