首先,this後可能會解釋一些事情。這不是你確切的問題,但答案的原因是相似的。
但是,爲了清楚瞭解逆向是什麼,你應該熟悉directed graphs。雖然不是直接顯而易見的,但有向圖是促進belongsTo
和hasMany
背後想法的原因。
但讓我們回到具體問題。讓我們以他們的榜樣爲例,只消除一些東西,使其更逼真。
App.Post = DS.Model.extend({
comments: DS.hasMany('comment', { inverse: 'post' })
});
App.Comment = DS.Model.extend({
post: DS.belongsTo('post', { inverse: 'comments' })
});
這是一個更現實的例子。每篇文章可以有任意數量的評論,而評論只能屬於一篇文章。說得通。正如你所看到的那樣,這些逆向指的是彼此。但什麼是逆向?反向關係只描述了在另一側調用兩個節點之間的邊界。例如,看一下這樣的畫面:
你會看到兩個節點之間的單一邊緣。從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);
這就是爲什麼灰燼,數據所需要的反比關係:所以它可以保持完整無你不必擔心。
來源
2014-09-06 13:09:10
GJK
現在完全瞭解它 - 非常感謝。我認爲Ember文檔可以使用更好的例子。 – ncksllvn 2014-09-08 17:34:29
很好的解釋 – sarmahdi 2017-08-17 21:45:17