2015-05-21 2 views
1

У меня есть модель виджета, которая имеет неглубокие отношения родитель-потомок. Данный виджет может быть «корневым» виджетами и не иметь какого-либо родителя, или может быть дочерним виджета, у которого есть родитель.Ember Data - получить родительское значение от дочернего

Модель данных уголек выглядит следующим образом:

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

Я пытаюсь добавить свойство «DisplayName», который будет отображаться имя для корневых виджетов, или «родитель имя - имя ребенка» для дочерних виджетов

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

Это не работает. DISPLAYNAME ребенка LOB всегда приходит как

undefined - WidgetName 

JSON возвращается следующим образом:

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

Для записи, все записи в настоящее время Returne в формате JSON в то же время.

Мне кажется, что Ember должен быть асинхронным решением родительского виджета, и строка также должна быть обновлена, однако она, похоже, не работает. Любая идея, что я делаю неправильно здесь?

ответ

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 собственность. Так что если значение name на parentWidget каждого обновления, вы не будете уведомлены. Измените эту строку на это, и вы должны быть хорошо идти:

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

    Просто имейте в виду, что первые несколько раз через, parentWidget.name все еще будет undefined. Это будет не то значение, которое вы хотите до тех пор, пока не решит обещание, а это означает, что вычисляемое свойство может запускаться несколько раз, прежде чем оно разрешится.

+0

Нет кубиков. Я сделал некоторые изменения с этими изменениями, но я должен уточнить, что все Widgets (около 300, вряд ли изменится) загружаются в маршрут, и это только пытается отобразить, когда я пытаюсь выбрать из выпадающего списка позже.Я действительно чувствую, что он должен иметь все необходимые данные, когда он отображается. – DVG

+0

Итак, чтобы сузить эту проблему, мне понадобятся две части информации. Во-первых, переопределяет ли вычисляемое свойство, когда обещает решение? (Сколько раз он запускается?) Во-вторых, если вы поместите точку останова в вычисленном свойстве в последний раз, как выглядит модель в Ember Inspector? Это он разрешил? Имеет ли свойство 'name'? – GJK

Смежные вопросы