值显示为[object Object] ember.js

时间:2014-08-16 23:58:57

标签: ember.js

我正在尝试为我的模型设置属性,但在嵌套对象时遇到问题。这就是我所拥有的

App.Posts = DS.Model.extend({
        title:  DS.attr('string'),
        author: {
            name:   DS.attr('string')
        },
        date:   DS.attr('date'),
        excerpt:    DS.attr('string'),
        body:   DS.attr('string')
    });

我想如何声明作者对象?

在ember检查器中,当我查看数据并在App.post下并选择其中一行时。它有一个属性App.Post,属性为author:{name:[Object]}

这里是JS Bin链接http://jsbin.com/tesozepexaqi/2/

2 个答案:

答案 0 :(得分:1)

从以下的Ember文档中调整this example应该可以正常工作:

App.Post = DS.Model.extend({
  title:  DS.attr('string'),
  author: DS.belongsTo('author'),
  date:   DS.attr('date'),
  excerpt:    DS.attr('string'),
  body:   DS.attr('string')
});

App.Author = DS.Model.extend({
  post: DS.belongsTo('post')
})

答案 1 :(得分:1)

Ember在没有Ember Data的情况下完美无缺。让我们假装我们想用Ember Data做这件事:

Ember Data的记录应该是持平的。这意味着所有属性都处于顶层。如果您有更深层次的相关数据,他们通常会生活在不同的记录中。如果您尝试嵌入记录,则需要查看嵌入式记录的棘手世界(Ember-data embedded records current state?)。至少这些相关记录必须定义一个id。所以这是一个从服务器返回的数据应该是什么样子的例子。

  {
    posts:[
      {
        id: '1',
        title:  'My name is Django.',
        author: {
          id:1,
          name:   'D name'
        },
        date:   new Date('08-15-2014'),
        excerpt:    'The D is silent.',
        body:   'The D is silent.'
      }, 
      {
         id: '2',
         title:  'White horse',
         author: {
           id:2,
             name:   'horse name'
         },
         date:   new Date('08-15-2014'),
         excerpt:    'Is what I ride.',
         body:   'My horse likes to dance.'
     }
    ]
  }

代码

App.ApplicationAdapter = DS.RESTAdapter.extend();


App.PostSerializer = DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
  attrs: {
    author: {embedded: 'always'}
  }
});

App.Post = DS.Model.extend({
  title:  DS.attr('string'),
  author: DS.belongsTo('author'),
  date:   DS.attr('date'),
  excerpt:    DS.attr('string'),
  body:   DS.attr('string')
});

App.Author = DS.Model.extend({
  name: DS.attr()
});

示例:http://jsbin.com/vazada/1/edit

另一个小技巧,你不想在使用路线时使用全局变量,你可以使用modelFor从不同的路线获取模型。

App.PostsRoute = Ember.Route.extend({
    model: function() {
        return this.store.find('post');
    }
});

App.PostRoute = Ember.Route.extend({
    model: function(params) {
      var posts = this.modelFor('posts');
      return posts.findBy('id', params.post_id);
    }
});

就我个人而言,我认为Ember Data有点矫枉过正。 Ember与POJO完美配合。如果您需要缓存和回滚功能,那么Ember Data可能是一个很好的解决方案。

示例:http://jsbin.com/vazada/2/edit