如何使用Grails控制器名称使Ember.js表现?

时间:2013-03-09 05:32:30

标签: grails ember.js ember-data

Grails功能非常强大,允许您使用单个语句(object as JSON)将域对象转换为JSON。不幸的是,由于一些原因,这还不足以与Ember.js互动。

如何让Grails与Ember.js很好地合作?

2 个答案:

答案 0 :(得分:12)

好问题,自我!

Ember.js及其自动AJAX-in-browser-data-store ninjitsu期望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想要什么

在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
]}