Вариант массива Ember с силой ember выберите

Моя модель имеет 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-изменить]

1 ответ

  1. Ember.A не будет создавать совершенно новый Arrayон будет просто реализует Ember.Enumerablesи массив интерфейсов (ссылка ).

    Вот мои предложенные варианты,

    1) чтобы создать новый массив, вы можете использовать toArrayметод. так измени это
    Ember.A(this.get('allCurrencies'))к this.get('allCurrencies').toArray()

    2) Другой вариант-итерация allCurrenciesс использованием forEachи внутри обратного вызова использовать итерацию базовой валюты для проверки условия и заполнения другого массива.

    var baseCurreny = this.get('model.baseCurrency');
    var otherCurrency = [];
    this.get('allCurrencies').forEach(function(item, index, self) {
        /*I assume id as your unique property to identify object
        if (!baseCurrency.findBy('id', item.id)) {
            otherCurrency.pushObject(item);
        }*/
        //or if its plain string then
        baseCurrency.forEach(function(baseItem) {
            if (item !== baseItem) {
                otherCurrency.pushObject(item);
            }
        });
    });
    
    1. Определение массива объекта валюты как [{id:1,name:'Dollar',type:'base'},{id:2,name:'Yen',type:'other'}]
      таким образом, вы можете использовать вычисляемые макросы для получения baseCurrenciesи otherCurrencies
     baseCurrencies: Ember.вычисленный.filterBy ('allCurrencies', 'type', 'base')
     otherCurrencies: Ember.вычисленный.filterBy ('allCurrencies', 'type', 'other')