2014-09-05 77 views
25

在閱讀完Ember頁面上的Getting Started指南後,我仍然有點困惑,究竟什麼是反向關係,以及何時定義它們。我知道在定義同一類型的多個關係時,您可能需要使用它們,但我發現該示例非常不清楚。這是從文檔樣本:Ember - 瞭解反向關係

var belongsTo = DS.belongsTo, 
    hasMany = DS.hasMany; 

App.Comment = DS.Model.extend({ 
    onePost: belongsTo('post'), 
    twoPost: belongsTo('post'), 
    redPost: belongsTo('post'), 
    bluePost: belongsTo('post') 
}); 


App.Post = DS.Model.extend({ 
    comments: hasMany('comment', { 
    inverse: 'redPost' 
    }) 
}); 

在這個例子中,爲什麼是挑出來作爲逆而不是其他類型的職位之一redPost?如何將redPost定義爲與其餘部分不同的區別?我也不明白爲什麼評論會有多個帖子,只會增加我的困惑。

回答

51

首先,this後可能會解釋一些事情。這不是你確切的問題,但答案的原因是相似的。

但是,爲了清楚瞭解逆向是什麼,你應該熟悉directed graphs。雖然不是直接顯而易見的,但有向圖是促進belongsTohasMany背後想法的原因。

但讓我們回到具體問題。讓我們以他們的榜樣爲例,只消除一些東西,使其更逼真。

App.Post = DS.Model.extend({ 
    comments: DS.hasMany('comment', { inverse: 'post' }) 
}); 

App.Comment = DS.Model.extend({ 
    post: DS.belongsTo('post', { inverse: 'comments' }) 
}); 

這是一個更現實的例子。每篇文章可以有任意數量的評論,而評論只能屬於一篇文章。說得通。正如你所看到的那樣,這些逆向指的是彼此。但什麼是逆向?反向關係只描述了在另一側調用兩個節點之間的邊界。例如,看一下這樣的畫面:

enter image description here

你會看到兩個節點之間的單一邊緣。從Post對象的角度來看,邊緣被稱爲comments。如果你想通過邊緣連接節點,你可以撥打post.get('comments')。但從Comment對象的角度來看,邊緣被稱爲post。如果您想使用Comment對象通過該邊緣連接節點,則必須致電comment.get('post')。這恰恰相反。它描述了不同的對象如何引用相同的關係。不同的名字,相同的邊緣。通過明確聲明逆,你可以告訴一個對象什麼是其他對象所稱的邊緣。

爲什麼這很重要?那麼,Ember-Data需要知道,因此它可以回報關係。例如,假設您有以下代碼:

var post = store.find('post', '1'); 
var newComment = store.createRecord('comment', {}); 

... 

post.get('comments').addObject(newComment); 

您所做的是創建一個新評論並將其連接到現有的post對象。一個簡單的用例。但是有一個問題:你只是把意見告訴了這個職位,反之亦然。你告訴帖子說你連接了評論,但是你沒有告訴評論你已將它連接到帖子。但作爲用戶,你期望這兩者同時發生。好吧,他們這樣做,那是因爲Ember-Data爲你做的。使用反向關係的名稱,Ember-Data可以確保當你做一個時,另一個也會發生。當你這樣做:

post.get('comments').addObject(newComment); 

灰燼,數據顯示,在幕後,真正做到這一點:

post.get('comments').addObject(newComment); 
newComment.set('post', post); 

就是爲什麼灰燼,數據所需要的反比關係:所以它可以保持完整無你不必擔心。

+9

現在完全瞭解它 - 非常感謝。我認爲Ember文檔可以使用更好的例子。 – ncksllvn 2014-09-08 17:34:29

+0

很好的解釋 – sarmahdi 2017-08-17 21:45:17