Grails功能非常强大,允许您使用单个语句(object as JSON
)将域对象转换为JSON。不幸的是,由于一些原因,这还不足以与Ember.js互动。
如何让Grails与Ember.js很好地合作?
答案 0 :(得分:12)
好问题,自我!
Ember.js及其自动AJAX-in-browser-data-store ninjitsu期望URL看起来有某种方式,而JSON看起来有某种方式。由于每个工具的工作方式,更容易对等式的两个方面进行一致的更改!
对于具有控制器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想要的是不同的。它希望网址/my_cool_domain_class
提供数据:
{ mycooldomainclass: [ { id: 1, name: "Bob"}, {id: 2, name "Sally"}] }
更新:我已经创建了一个ember-data-grails
repo on Github来处理所有这些修改,并演示了如何使控制器很好地运行!
答案 1 :(得分:0)
我从ember js开始,在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
]}