1

我刚刚开始使用 Ember 和 Ember Data。我有一个非常简单的服务,它正在访问我的后端服务(用 Node 编写)。我的服务返回两个项目。在我的 HTML 中,我的两个项目显示,或者至少它们的 ID 显示。其他属性没有被渲染。

结果:

* Hello, 1 !
* Hello, 2 !

应用程序.js

var App = Ember.Application.create();

App.Store = DS.Store.extend({
    revision: 11
});

App.Grunt = DS.Model.extend({
    firstName: DS.attr('string'),
    lastName: DS.attr('string')
});

App.Router.map(function() {
    this.route("grunts", { path: "/grunts" });
});

App.IndexRoute = Ember.Route.extend({
    redirect: function() {
        this.transitionTo('grunts');
    }
});

App.GruntsRoute = Ember.Route.extend({
    model: function() {
        return App.Grunt.find();
    }
});

索引.html

<script type="text/x-handlebars" data-template-name="application">
    <div>
        <p>{{outlet}}</p>
    </div>
</script>

<script type="text/x-handlebars" data-template-name="grunts">
    <ul>
        {{#each controller}}
            <li>Hello, {{id}} {{firstName}} {{lastName}}!</li>
        {{/each}}
    </ul>
</script>

JSON:

{
    "grunts": [
        {
            "id": 1,
            "firstName": "Joe",
            "lastName": "Bloggs"
        },
        {
            "id": 2,
            "firstName": "Someone",
            "lastName": "Else"
        }
    ]
}

谢谢你的帮助!

4

1 回答 1

2

默认RESTAdapter映射是下划线 -> 驼峰形式。这意味着如果您的模型的属性是firstName,服务器应该发送包含first_name.

要解决此问题,您可以发送如下所示的 JSON:

"grunts": [
  {
    "id": 1,
    "first_name": "Joe",
    "last_name": "Bloggs"
  }]

或者覆盖keyForAttributeName你的函数RESTSerializer。对于一对一映射,您可以执行以下操作:

keyForAttributeName: function(type, name) {
  return name;
}

或者像这样映射单个模型:

adapter.map('App.Grunt', { 
  firstName: { keyName: 'firstName'},
  lastName: { keyName: 'lastName'}
});
于 2013-02-20T12:01:08.467 回答