Ember.Select: неправильно выбранное значение при асинхронной настройке содержимого

#ember.js

#ember.js

Вопрос:

Вот проблема в jsbin: http://emberjs.jsbin.com/bahuvusa/29/edit

Когда у меня есть выбор, подобный этому:

 {{view Ember.Select
  contentBinding="items"
  optionValuePath="content.value"
  optionLabelPath="content.caption"
  value=value
}}
 

Where items задается в маршруте как an PromiseArray , и данные выглядят следующим образом:

 [
  {value: 1, caption: "one"},
  {value: 2, caption: "two"},
  {value: 3, caption: "three"}
]
 

И у меня есть значение, установленное в контроллере:

 value: function() {
  return 2;
}.property()
 

При рендеринге шаблона я хотел бы видеть, что выбран второй элемент, но вместо этого значение устанавливается undefined равным (см. jsbin).

Есть ли способ заставить это работать? (без создания элементов в модели ember-data и использования selectionBinding )

Обновить

В итоге я использовал afterModel перехват и вернул из него обещание: http://emberjs.jsbin.com/bahuvusa/40/edit

Комментарии:

1. Вероятно, связано с проблемами 1333 и 1405 ..

Ответ №1:

Основываясь на комментариях к вашему сообщению, я взял часть кода из последнего комментария в этом тикете github.com/emberjs/ember.js/issues/1333 и внес некоторые небольшие изменения, вот как теперь выглядит код: http://emberjs.jsbin.com/bahuvusa/30/edit

Комментарии:

1. Спасибо за предложение! Мой пример был слишком надуманным, я обновил jsbin: emberjs.jsbin.com/bahuvusa/29/edit . В этом случае у контроллера уже есть другая модель, поэтому я не могу использовать model перехват..

2. Я вижу, похоже, ваша проблема связана с проблемами, которые вы указали в комментариях, почему бы вам не попробовать какое-либо из приведенных там решений?, Я использовал одно из последних комментариев в этом выпуске github.com/emberjs/ember.js/issues/1333 и это сработало.

3. Я использовал почти тот же код, что и ссылка в предыдущем комментарии emberjs.jsbin.com/bahuvusa/30/edit

4. Сначала это казалось взломом, но я думаю, что это самое простое решение здесь. Спасибо, fanta ! Вы можете обновить свой ответ, и я его приму

Ответ №2:

Вы можете привязать выделение к модели или свойству, которое хотите динамически обновлять, на основе этого события изменения выделения. Итак, назначьте модель или коллекцию selection свойству, и вы также можете установить prompt там:

 {{view Ember.Select
  contentBinding="content"
  optionValuePath="content.value"
  optionLabelPath="content.caption"
  selection=model.value
  prompt="Set the prompt"
  value=value
}}
 

Пример JSBin: http://emberjs.jsbin.com/bahuvusa/27/edit

Это практически та же концепция / шаблон по всем направлениям, что и у помощников handlebars. Надеюсь, это пригодится!

Комментарии:

1. Спасибо, Мэтью! Дело в том, что я хочу, чтобы 2-й элемент был выбран при первом отображении шаблона (отсюда value=value и свойство в IndexController)

2. @whatthewhat Ну, это асинхронно, поэтому вам нужно указать значение по умолчанию. Оно должно быть либо в модели, либо в свойстве контроллера. Для меня код работает правильно… Вы можете удалить приглашение, чтобы увидеть, что первое отображаемое значение равно 2.