Có ai đưa ra câu trả lời cho các hiệp hội đa hình và dữ liệu ember không?Liên kết đa hình dữ liệu Ember
Chúng tôi cần một số cách để có thể truy vấn loại ở đầu kia của mối quan hệ từ những gì tôi có thể nói.
Bất kỳ ai có suy nghĩ về điều này?
Có ai đưa ra câu trả lời cho các hiệp hội đa hình và dữ liệu ember không?Liên kết đa hình dữ liệu Ember
Chúng tôi cần một số cách để có thể truy vấn loại ở đầu kia của mối quan hệ từ những gì tôi có thể nói.
Bất kỳ ai có suy nghĩ về điều này?
Vì vậy, tôi có điều gì đó. Nó không hoàn thành, hoặc hoàn toàn sạch sẽ, nhưng nó hoạt động. Về cơ bản, tôi sử dụng một mixin để bỏ qua các hiệp hội Ember hoàn toàn. Tôi chắc chắn rằng điều này có thể được cuộn vào bộ chuyển đổi hoặc cửa hàng, nhưng bây giờ công trình này.
mô hình đa hình đi qua JSON với một ItemID và itemtype:
App.Follow = DS.Model.extend
user: DS.belongsTo('App.User')
itemId: DS.attr("number")
itemType: DS.attr("string")
tôi thêm một mixin với các mô hình có liên quan đến nó:
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')
Các mixin thực hiện ba phương pháp, một bản cập nhật changeCount, một phương thức trả về kiểu của mô hình và phương thức polymorphicFilter để lọc mô hình theo itemType và 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')
Lớp điều khiển được bảo vệ khỏi tất cả jankyness này, trừ trường hợp phải gọi điện updatePolymorphicRelationship để đảm bảo các ràng buộc lửa:
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()
Đó là những gì tôi có cho đến nay. Tôi đang cố gắng để giữ cho mọi thứ trong lớp mô hình vì nó chỉ là một bước gỡ bỏ từ lớp bộ chuyển đổi. Nếu có vẻ như dữ liệu Ember sẽ không xem xét đa hình trong tương lai, thì nó sẽ có ý nghĩa để kéo tất cả lên mức cao hơn, nhưng hiện tại, nó hoạt động và để lại bộ điều khiển (tương đối) sạch sẽ.
hiệp hội đa hình hiện nay được hỗ trợ trong dữ liệu ember
https://github.com/emberjs/data/commit/e4f7c3707217c6ccc0453deee9ecb34bd65c28b9
Với ember-dữ liệu mới nhất xây dựng bây giờ bạn có thể sử dụng các hiệp hội đa hình:
Bạn cần phải cấu hình mô hình của bạn để làm cho nó đa hình:
/* 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})
});
Bạn cũng cần định cấu hình alias
thuộc tính trêncủa mình
DS.RESTAdapter.configure('App.Post' {
alias: 'post'
});
DS.RESTAdapter.configure('App.Comment' {
alias: 'comment'
});
Kết quả mong đợi từ máy chủ của bạn nên được như thế này:
{
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"
}
}
biết thêm thông tin trong this github thread
Tôi đã gặp sự cố khi một mô hình có nhiều liên kết đa hình - một Bài đăng có thể được nhận xét, có thể đính kèm và thông báo - bạn có gặp sự cố đó trước đây không?Tôi đã từng làm việc xung quanh nó bằng cách có mỗi mô hình "đa hình" của tôi kéo dài từ cuối cùng nhưng điều này có nghĩa là tôi không kiểm soát được các thuộc tính nào xuất hiện trên mỗi mô hình. –
Xảy ra để biết lý do 'hasMany' thay thế một ID với một đối tượng' {id: 1, type: 'type'} ', trong khi một thuộc tính injects này vào đối tượng cha? Nó sẽ sạch hơn nhiều nếu chúng giống nhau, ví dụ: 'comment: {id: 1, message: {id: 1, type: 'post'}}' – Joe
Bạn có thể cho một ví dụ cụ thể về những gì bạn muốn làm gì? – pangratz
Tôi muốn có thể có một cái gì đó như: JSON: {... "attachTo": {"user_id": 16} ...} và theo định nghĩa mô hình: attachedTo: DS.belongsTo ("tự động") –