4

Grails 非常强大,可以让您使用单个语句 ( object as JSON) 将域对象转换为 JSON。不幸的是,由于某些原因,这不足以与 Ember.js 交互。

如何让 Grails 与 Ember.js 很好地配合使用?

4

2 回答 2

12

好问题,自我!

Ember.js 和它的 auto-AJAX-in-browser-data-store ninjitsu 期望 URL 以某种方式呈现,而 JSON 以某种方式呈现。由于每个工具的工作方式,更容易对等式两边进行一致的更改!

Grails 提供什么

MyCoolDomainClass对于带有控制器的 Domain 类MyCoolDomainClassController,Grails 想要提供 URL /app/myCoolDomainClass。如果您将控制器设置为包含以下内容:

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

您将收到如下所示的响应:

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

Ember 想要什么

在 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,它会为你处理所有这些修改,并演示如何制作一个很好玩的控制器!

于 2013-03-09T05:32:29.600 回答
0

我从 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
]}
于 2014-05-22T12:26:14.603 回答