Как заставить 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
]}