Моя модель имеет 2 атрибута (baseCurrency
и otherCurrencies
), значения которых выбираются в форме 2 ember power выбирает выпадающее меню, параметры которого зависят от 2 вычисляемых свойств ( baseCurrencyOptions
и otherCurrencyOptions
)
контроллер
...
otherCurrencyOptions: Ember.computed('model.baseCurrency', function() {
console.log(`allCurrencies changed to: ${this.get('allCurrencies')}`);
return Ember.A(this.get('allCurrencies')).removeObject(this.get('model.baseCurrency'));
}),
baseCurrencyOptions: Ember.computed('model.otherCurrencies', function() {
console.log(`allCurrencies changed to: ${this.get('allCurrencies')}`);
return Ember.A(this.get('allCurrencies')).removeObjects(this.get('model.otherCurrencies'));
})
...
allCurrencies
свойство содержит список всех валют и не должно меняться с течением времени.
шаблон
{{#power-select searchEnabled=true options=baseCurrencyOptions selected=model.baseCurrency onchange=(action (mut model.baseCurrency) as |currency|}}
{{currency}}
{{/power-select}}
{{#power-select-multiple searchEnabled=true options=otherCurrencyOptions selected=model.otherCurrencies onchange=(action (mut model.otherCurrencies)) as |currency|}}
{{currency}}
{{/power-select-multiple}}
Проблема в том, что каждый раз, когда я выбираю валюту в одном или другом из обоих раскрывающихся менюallCurrencies
, свойство обновляется, теряя необратимым образом каждую выбранную валюту. Я ожидал Ember.A()
создать совершенно новый объект без изменения ‘ allCurrencies!. Кроме того, я получил следующее предупреждение:
Устаревание: вы изменили concatenatedTriggerClasses дважды за один рендер. Это было ненадежно в Ember 1.x и будет удален в Ember 3.0 [идентификатор устаревания: ember-views.render-double-изменить]
Ember.A
не будет создавать совершенно новыйArray
он будет просто реализуетEmber.Enumerables
и массив интерфейсов (ссылка ).Вот мои предложенные варианты,
1) чтобы создать новый массив, вы можете использовать
toArray
метод. так измени этоEmber.A(this.get('allCurrencies'))
кthis.get('allCurrencies').toArray()
2) Другой вариант-итерация
allCurrencies
с использованиемforEach
и внутри обратного вызова использовать итерацию базовой валюты для проверки условия и заполнения другого массива.[{id:1,name:'Dollar',type:'base'},{id:2,name:'Yen',type:'other'}]
таким образом, вы можете использовать вычисляемые макросы для получения
baseCurrencies
иotherCurrencies