EmberJS, как наблюдать за изменениями в любом объекте хеша

У меня есть объект вроде:

// app/services/my-service.js
import Ember from 'ember';

export default Ember.Service.extend({
  counters: Ember.Object.create()
})

myService.counters – это хэш, например:

{
  clocks: 3,
  diamons: 2
}

Я хочу добавить к этому объекту вычисляемый атрибут, который возвращает сумму myService.counters.clocks плюс myService.counters.diamons

// app/services/my-service.js
...
count: Ember.computed('counters.@each', function(){
  return _.reduce(this.get('counters'), function(memo, num){ return memo + num; }, 0);
})
...

Но конфигурация наблюдателя не принимается, и у меня есть ошибка:

Uncaught Error: Assertion Failed: Depending on arrays using a dependent key ending with `@each` is no longer supported. Please refactor from `Ember.computed('counters.@each', function() {});` to `Ember.computed('counters.[]', function() {})`.

Но если я внесу предложенное изменение:

// app/services/my-service.js
...
count: Ember.computed('counters.[]', function(){
  return _.reduce(this.get('counters'), function(memo, num){ return memo + num; }, 0);
})
...

Атрибут count не обновляется.

Единственный способ, которым я могу заставить его работать, выглядит следующим образом:

// app/services/my-service.js
...
count: Ember.computed('counters.clocks', 'counters.diamons', function(){
  return _.reduce(this.get('counters'), function(memo, num){ return memo + num; }, 0);
})
...

Как я могу использовать какой-либо подстановочный знак для этой ситуации?


person fguillen    schedule 07.03.2016    source источник


Ответы (1)


@each и [] предназначены для наблюдения за элементами массива и массивами.

Вы не можете использовать подстановочный знак, потому что это серьезно понизит производительность. Существует сокращение для нескольких свойств:

count: Ember.computed('counters.{clocks,diamons}', function() {
    return this.get('counters').reduce((memo, num) => memo + num, 0);
})

Я также обновил вычисляемую логику, чтобы использовать Array#reduce и стрелочную функцию с неявным возвратом.

person locks    schedule 07.03.2016
comment
Проблема в том, что я заранее не знаю, какие ключи моего counters :/ .. этим атрибутом управляют из класса модулями, которые изменяют значения и даже добавляют новые ключи. - person fguillen; 07.03.2016
comment
Если вам нужно указать зависимые ключи вычисляемого свойства во время выполнения, используйте defineProperty. - person Patrick Fisher; 08.03.2016