Вычисляемое свойство, которое возвращает сумму свойств для каждой модели.

У меня есть модель тележки, в которой есть предметы, которые выглядят примерно так

[
    {
        "item_id": 1,
        "item_name":"Item 1",
        "item_price": 500
    },
    {
        "item_id": 2,
        "item_name": "Item 2",
        "item_price": 230
    },
    {
        "item_id": 3,
        "item_name": "Item 3",
        "item_price": 150
    }
]

Мне нужно обобщить свойство item_price, чтобы иметь возможность отобразить его, а затем передать его в данные ember или вызов ajax для завершения покупки.

Не уверен, что я просто не понимаю, что такое совокупные данные с вычисленными, но я пытаюсь с этим

totalDue: Ember.computed.sum('[email protected]_price')

На контроллере, но он возвращает 0

Я на тлеющем 2.2.0


person Jordan    schedule 23.12.2015    source источник
comment
Ember.computed.sum делает что-то другое: он просто суммирует значения в свойстве со значением массива.   -  person    schedule 22.01.2016


Ответы (3)


Вы также можете сделать это как очень чистый однострочный код:

totalDue: Ember.computed('[email protected]_price', function() {
  return this.get('model').mapBy('item_price').reduce((a, b) => a + b, 0);
})

Рабочая демонстрация

person jeffdill2    schedule 24.12.2015
comment
Получение ошибки this.get(...).mapBy is not a function в консоли на этом. - person Jordan; 22.01.2016
comment
Если вы поместите это - console.log(this.get('model')) - над выражением return, что оно выведет для вас? - person jeffdill2; 22.01.2016
comment
Извините, я забыл, что переключаю модель на хэш RSVP, поэтому мне нужно было использовать mode.items, чтобы получить часть элементов хэша модели. - person Jordan; 22.01.2016
comment
А, так пойдет. :-) - person jeffdill2; 22.01.2016

Вы можете сделать это следующим образом:

totalDue: Ember.computed('[email protected]_price', function() {
  const model = this.get('model');
  if (!model) {
    return 0;
  }

  let sum = 0;
  model.forEach(item => sum += Ember.get(item, 'item_price'));
  return sum;
})

Рабочая демонстрация.

person Daniel Kmak    schedule 23.12.2015
comment
Получение model.forEach is not a function, также модель определяется на маршруте в хуке модели, просто еще не используя данные ember или вызов ajax. А еще я на тлеющем 2.2.0 - person Jordan; 23.12.2015
comment
Можете ли вы показать мне значение console.log(this.get('model')) в контроллере? Так model определено на контроллере или нет? Если нет, то вы должны установить свойство model в хуке setupController в маршруте, прежде чем использовать его. - person Daniel Kmak; 23.12.2015
comment
Извините, ваш код сработал, поскольку я опубликовал это, я настроил маршрут для возврата нескольких моделей, поэтому изменение строки this.get('model') на this.get('model.items') сработало. - person Jordan; 23.12.2015

Вы также можете сделать это следующим образом:

export default Ember.Controller.extend({
      model: [
        {
          "item_id": 1,
          "item_name":"Item 1",
          "item_price": 500
        },
        {
          "item_id": 2,
          "item_name": "Item 2",
          "item_price": 230
        },
        {
          "item_id": 3,
          "item_name": "Item 3",
          "item_price": 150
        }
      ],

      array: Ember.computed.mapBy('model', 'item_price'),
      sum: Ember.computed.sum('array'),
    });
person joshuahornby10    schedule 01.06.2017