Ember Data принадлежит с раскрывающимся списком Select

Я пытаюсь сделать что-то довольно простое с Ember и Ember Data.

1) Сообщения принадлежат пользователям; Пользователи hasMany Posts

2) В созданной новой форме сообщения я хочу выбрать/выпадающего списка всех пользователей

3) Когда я редактирую сообщение (используя ту же форму), я хочу правильно привязать его к Dropbox

Вопрос: Какова наилучшая практика для выпадающего списка, связанного с списком пользователей? Как связать форму редактирования, чтобы снова заполнить выпадающее меню?

Модель пользователя:

App.User = DS.Model.extend({
  posts: DS.hasMany('post', {async: true}),
});

Модель сообщения:

App.Post = DS.Model.extend(Ember.Validations.Mixin, {
  user: DS.belongsTo('user', {async: true}),
});

Создать новую форму сообщения:

{{view Em.Select
  content=users <<<<< How do I bind this.store.find("user") here?
  optionValuePath='content.id'
  optionLabelPath='content.name'
}}

Я не понимаю, как лучше всего привязать выбранный контент к пользователям.

Попытка 1:

* Я использую Ember-Form

  {{em-select
    property="user_id"
    label="user"
    prompt="Select user:"
    content=controllers.users.content
    optionValuePath="content.id"
    optionLabelPath="content.first_name"
  }}

И в действии сохранения:

newItem.set('user', this.store.getById('user', this.get('user_id')));

Я попытался использовать user_id как мое свойство для формы и перевести обратно к объекту пользователя, чтобы назначить сообщение при сохранении. Однако этот метод выглядит глупо, потому что я активно переводил user_id в объект пользователя каждый раз, когда я сохраняю. Я чувствую, что должен быть способ, которым это будет сделано автоматически, если я сделал правильное связывание, вместо того, чтобы прыгать через обручи, чтобы связать свойство как user_id. Это также затрудняет привязку назад, когда я использую ту же форму для редактирования сообщения. Поскольку все отношения были установлены, у меня возникает ощущение, что я делаю что-то неправильно здесь. Я думаю, что должен быть лучший способ.

Спасибо!

Ответ 1

По состоянию на сентябрь 2014 года существует проблема с Ember.Select plus { async: true }. Они не хорошо играют вместе.

myModel.get('myAsyncRel') вернет обещание, Ember.Select не обещает знать, поэтому он не может справиться с этим должным образом.

Один способ обхода - использовать неасинхронные отношения.

Другим обходным решением является использование чего-то вроде этого:

Ответ 2

Команда ember открыла проблему (# 5259) для этой проблемы, они планируют переписать всю часть Ember.Select.

Тем временем вы можете использовать это дополнение от thefrontside:

{{#x-select value=bob action="selectPerson"}}
  {{#x-option value=fred}}Fred Flintstone{{/x-option}}
  {{#x-option value=bob}}Bob Newhart{{/x-option}}
{{/x-select}}

Установите его с помощью ember install emberx-select


РЕДАКТИРОВАТЬ Как писал Stefan Penner , теперь вы можете использовать выбор ember следующим образом (jsbin):

<select onchange={{action "changed" value="target.value"}}>
    {{#each model.choices key="@identity" as |choice|}}
      <option value={{choice}} selected={{is-equal currentValue choice}}>{{choice}}</option>
    {{/each}}
</select>  

Ответ 3

Когда вы говорите выпадающее меню, я предполагаю, что вы имеете в виду поле выбора? У Ember API есть выбор, который обрабатывает все привязки данных. Вот документы для Ember.Select.

Вы можете использовать его в своей почтовой форме, например:

{{view Em.Select
  content=users
  selection=user
  optionValuePath='content.id'
  optionLabelPath='content.name'
}}

Если вы используете Dockyard awesome ember-easyForm library, вы можете использовать Em.Select следующим образом:

{{input user type='as'
  collection='users'
  selection='user'
  optionValuePath='content.id'
  optionLabelPath='content.name'
  prompt='Choose type...'
}}

Расширенный пользовательский интерфейс с использованием Chosen можно легко интегрировать с Ember like это.

Ответ 4

Новая информация об устаревании была добавлена ​​в Ember 1.13 для Ember Select, см. http://emberjs.com/deprecations/v1.x/#toc_ember-select.

Новый рекомендуемый подход в Ember 1.13/2.0 - это реализовать компонент самостоятельно:

например. /components/my -select.hbs

<select>
  {{#each users "id" as |user|}}
  {{log address}}
    <option value="{{user.id}}">
      user.name
    </option>
  {{/each}}
</select>

Ссылка ember показывает, как реализовать выбор с помощью selected={{is-equal item selectedValue}} и создания помощника is-equal.