ember.js - Ember数据多态关联

  显示原文与译文双语对照的内容
0 0

有人想出了答案多态关联和嵌入数据?

我们就需要一种方法能够查询该类型的另一端的关系就我看来。

有人对此有主意了?

时间:原作者:5个回答

0 0

使用最新的生成现在可以使用嵌入数据多态关联:

你需要配置你的Models以使其多态:

/* polymorphic hasMany */
App.User = DS.Model.extend({
 messages: DS.hasMany(App.Message, {polymorphic: true})
});
App.Message = DS.Model.extend({
  created_at: DS.attr('date'),
  user: DS.belongsTo(App.User)
});
App.Post = App.Message.extend({
  title: DS.attr('string')
});
/* polymorphic belongsTo */
App.Comment = App.Message.extend({
  body: DS.attr('string'),
  message: DS.belongsTo(App.Message, {polymorphic: true})
});

还需要配置 alias属性上 RESTAdapter

DS.RESTAdapter.configure('App.Post' {
  alias: 'post'
});
DS.RESTAdapter.configure('App.Comment' {
  alias: 'comment'
});

需要从服务器得到结果应该如下所示:

{
    user: {
        id: 3,
        // For a polymorphic hasMany
        messages: [
            {id: 1, type: "post"},
            {id: 1, type: "comment"}
        ]
    },
    comment: {
        id: 1,
        // For a polymorphic belongsTo
        message_id: 1,
        message_type: "post"
    }
}

更多信息在此GitHub 线程

原作者:
0 0

所以我有些东西。 还需要修改一下或完全干净的,不过同样工作良好。 基本上,我使用mixin可以完全绕过Ember关联。 我相信,这可能是去到适配器或者存储,但是目前它是如何工作的。

多态模型都通过JSON,其中包含一个itemId和itemType :

App.Follow = DS.Model.extend
  user: DS.belongsTo('App.User')
  itemId: DS.attr("number")
  itemType: DS.attr("string")

我添加了一个mixin到与之关联的模型:

App.Hashtag = DS.Model.extend App.Polymorphicable,
  follows:(-> 
  name: DS.attr("string")
    @polymorphicFilter(App.Follow, "Hashtag")
  ).property('changeCount')  #changeCount gives us something to bind to
  followers: (->
    @get('follows').map((item)->item.get('user'))
  ).property('follows')

mixin实现三个方法,其中一个更新changeCount,一种返回模型的类型和polymorphicFilter方法来过滤模型由itemType和id :

App.Polymorphicable = Ember.Mixin.create
  changeCount: 1 
  polymorphicFilter: (model, itemType)->
    App.store.filter model, 
      (data) =>
        if data.get('itemId')
          @get('id') is data.get('itemId').toString() and data.get('itemType') is itemType 
  itemType:()->
    @constructor.toString().split('.')[1]
  updatePolymorphicRelationships:()->
    @incrementProperty('changeCount')

在控制器层被写保护所有这些jankyness updatePolymorphicRelationship,只是不必调用以确保绑定触发:

App.HashtagController = Ember.ObjectController.extend
  follow:()->
    App.Follow.createRecord({
      user: @get('currentUserController.content')
      itemId: @get('id')
      itemType: @get('content').itemType()
    })
    #this provides a way to bind and update. Could be refactored into a didSave()
    #callback on the polymorphic model.
    @get('content').updatePolymorphicRelationships()
    App.store.commit()

那就是我有多远。 我只是想使问题在模型层移动到稍为远,它只不过是一个适配器层。 如果看起来嵌入数据根本不是去看看polymorphics今后,甭管办妥所有提高到更高的级别,但现在,它的工作原理,并保留我的控制器( 相对) 简洁。

原作者:
...