2015-05-21 38 views
1

我有一個小部件模型,它具有淺的父子關係。給定的小部件可能是「根」小部件,並且沒有任何父項,或者它可能是具有父項的子小部件。Ember數據 - 從子項獲取父項值

餘燼數據模型是這樣的:

export default DS.Model.extend({ 
    name:   DS.attr('string'), 
    parentWidget: DS.belongsTo('widget', { async: true, inverse: null }), 
    isSubWidget: DS.attr('boolean') 
}) 

我想添加一個「顯示名」屬性,將顯示名稱爲根小部件或「父名 - 孩子的名字」爲子部件

displayName: Ember.computed('name', 'parentWidget.name', 'isSubLob', function() { 
    if this.get('isSubWidget') { 
    return "#{this.get('parentWidget.name')} - #{@get('name')}" 
    } 
    else { 
    return "#{this.get('name')}" 
    } 
}) 

但是,這不起作用。孩子高球的顯示名總是爲

undefined - WidgetName 

的JSON被返回,像這樣:

{ 
"widgets": [ 
    { 
    "id": 2, 
    "name": "Widget Name", 
    "is_sub_widget": true, 
    "parent_widget_id": 1 
    }, 
    ... 
} 

對於記錄,所有記錄都被同時json的returne。

我覺得像灰燼應該是asyncronously解決父控件和字符串應更新爲好,但它似乎並不奏效。任何想法我在這裏做錯了嗎?

回答

2

我會說你有兩個問題:

  1. 你不聲明倒數,以你的parentWidget關係,這意味着Ember公司的數據猜測逆(和可能的猜測是錯誤的)。你應該改變這種聲明是這樣的,只是要確定:

    parentWidget: DS.belongsTo('widget', { async: true, inverse: null }), 
    

    我懷疑,這將解決您的問題,但它是很好的做法。

  2. 在試圖使用該名稱之前,您並未等待您的承諾解決。您已將parentWidget關係指定爲異步,這意味着@get('parentWidget')而不是返回模型。它將返回一個承諾最終將解決您的模型。通常情況下,這樣會很好,因爲只有當您沒有看到正確的密鑰時,計算的屬性纔會在承諾解決時重新計算。

    /* PS: Assuming that your comma was misplaced on this line */ 
    displayName: Ember.computed('name', 'parentWidget', function() { 
                ^^^^^^^^^^^^ 
    

    如所看到的,您只能看到parentWidget屬性。因此,如果parentWidget上的name屬性每次更新,您都不會收到通知。更改該行這一點,你應該是好去:

    displayName: Ember.computed('name', 'parentWidget.name', function() { 
    

    只要記住通過,parentWidget.name前幾次仍將undefined。在承諾解決之前,它不會是您想要的值,這意味着計算的屬性可以在解決之前運行多次。

+0

沒有骰子。我對這些更改做了一些修改,但是我應該澄清一下,所有Widget(大約300個,不太可能改變)都會加載到路由中,並且只會在嘗試從後面的下拉列表中選擇時顯示。我真的覺得應該在顯示時已經擁有了所有需要的數據。 – DVG

+0

所以爲了縮小這個問題,我需要兩條信息。首先,當承諾解決時,計算的屬性是否重新計算? (它運行多少次?)其次,如果您在最後一次通過計算屬性中放置斷點,那麼模型在Ember Inspector中看起來如何?它解決了嗎?它有'name'屬性嗎? – GJK

相關問題