Передача связанных моделей в действия в EmberJS

Мне трудно понять логику того, как EmberJS имеет дело с передачей связанных моделей в качестве аргументов действия.

В шаблоне у меня есть следующее:

{{#each account.people as |person|}}
  <p>{{person.name}}</p>

  {{#each person.relationships as |relationship|}}
    <p {{action "doStuff" person relationship relationship.otherPerson}}>
      {{relationship.otherPerson.name}}
    </p>
  {{/each}}
{{/each}}

Странная вещь в том, что в doStuffдействии

  • person быть моделью
  • relationship быть моделью
  • otherPerson это обещание

Я не знаю, является ли это ожидаемым поведением и как правильно с ним обращаться, если да.

Примечание: это надуманный пример, и передача всех этих аргументов странна, это просто для иллюстрации моей точки зрения.

Note2: я знаю, что я мог бы использовать Promise.resolve(otherPerson)в моем действии, но я не вижу, почему я должен использовать вызов низкого уровня, как это.

Note3: мой вопрос: «так как я получаю доступotherPerson.name, почему все otherPersonеще обещание быть решенным, когда я нахожусь в действии? Есть ли способ всегда иметь разрешенную модель, не делая хаки?»

Спасибо!

1 ответ

  1. Я не уверен, что фактический вопрос здесь, но…

    relationship.otherPerson
    

    это обещание, потому что Ember Data lazy загружает отношения. Шаблоны HTMLBars способны понять и ждать разрешения отношений, но они все еще обещают, как под капотом.

    При использовании {async: false}в определении модели
    например.

    export default Model.extend({
      name: attr('string')
      author: belongsTo('person', {async:false})
    });
    

    Это говорит данным Ember, что данные уже загружены и что они могут рассматривать связь как синхронную. При доступе обещание не возвращается relationship.otherPerson. Это действительно требует, чтобы у вас уже были загружены данные отношений, либо загруженные в маршрут, либо от уверенности, что они уже в магазине.

    Это немного сбивает с толку, Как Ember позволяет счастливо получить доступ к отношениям с синтаксисом dot в шаблоне, но в коде вы должны относиться к нему как к обещанию.