Grails 非常强大,可以让您使用单个语句 ( object as JSON
) 将域对象转换为 JSON。不幸的是,由于某些原因,这不足以与 Ember.js 交互。
如何让 Grails 与 Ember.js 很好地配合使用?
Grails 非常强大,可以让您使用单个语句 ( object as JSON
) 将域对象转换为 JSON。不幸的是,由于某些原因,这不足以与 Ember.js 交互。
如何让 Grails 与 Ember.js 很好地配合使用?
好问题,自我!
Ember.js 和它的 auto-AJAX-in-browser-data-store ninjitsu 期望 URL 以某种方式呈现,而 JSON 以某种方式呈现。由于每个工具的工作方式,更容易对等式两边进行一致的更改!
MyCoolDomainClass
对于带有控制器的 Domain 类MyCoolDomainClassController
,Grails 想要提供 URL /app/myCoolDomainClass
。如果您将控制器设置为包含以下内容:
def index() { render MyCoolDomainClass.list() as JSON }
您将收到如下所示的响应:
[{ id: 1, name: "Bob"}, {id: 2, name: "Sally"}]
在 Ember.js 中,您可以创建具有相同属性的模型。通过利用ember-data
,您可以轻松地将浏览器中的 Data Store 与您的后端连接起来。不幸的是,Ember.js 想要的是不同的。它期望 url/my_cool_domain_class
提供数据:
{ mycooldomainclass: [ { id: 1, name: "Bob"}, {id: 2, name "Sally"}] }
更新:我ember-data-grails
在 Github 上创建了一个 repo,它会为你处理所有这些修改,并演示如何制作一个很好玩的控制器!
我从 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
]}