Подтвердить что ты не робот

Как наблюдатель может узнать до и после значения наблюдаемого свойства в Ember.js?

См. решение другого вопроса, предоставленного ud3323: http://jsfiddle.net/ud3323/ykL69/. Это решение подчеркивает измененное значение с использованием красного цвета. У меня есть дополнительное требование: если значение увеличило выделение в зеленом цвете, если оно уменьшило выделение красным цветом. Для этого мне нужно знать старые и новые ценности в моем наблюдателе. Есть ли способ сделать это?

P.S. В документах Embers ничего не говорится о том, что доступно в функции наблюдателя. Все, что я могу сказать из примера, состоит в том, что, поскольку наблюдатель определен в itemRowView, "this" указывает на itemRowView.

4b9b3361

Ответ 1

Взгляните на beforeObserver s. A beforeObserver срабатывает перед изменением свойства. Поэтому, если вы get свойство в beforeObserver, вы получите значение перед изменением. Вы настраиваете этот тип наблюдателя с помощью Ember.addBeforeObserver или через расширение прототипа функции observesBefore.

Это даст вам то, что вам нужно для достижения вашей цели. Я создал следующий JSBin, основанный на вашей скрипке, чтобы продемонстрировать это здесь: http://emberjs.jsbin.com/qewudu/2/edit

ОБНОВЛЕНО на 2014-10-07, чтобы отразить поведение в Ember 1.7.x.

UPDATE в 2015-02: beforeObserver устарел. Другие ответы на этот вопрос.

Ответ 2

beforeObserver был устарел в Ember 1.10.

Вместо этого используйте ручной кеш:

doSomething: Ember.observer( 'foo', function() {
  var foo = this.get('foo');
  var oldFoo = this.get('_oldFoo');

  if (foo === oldFoo) { return; }

  // Do stuff here

  this.set('_oldFoo', foo);
})

Ответ 3

Используйте willInsertElement, чтобы сохранить начальное значение, и после изменения значения сравните два:

Quotes.itemRowView = Ember.View.extend({
    tagName: 'tr',

    initialValue: null,

    willInsertElement: function(){
        var value = this.get('content').value;
        this.set('initialValue', value); 
    },

    valueDidChange: function() {
        // only run if updating a value already in the DOM
        if(this.get('state') === 'inDOM') {
            var new_value = this.get('content').value;
            // decreased or increased?
            var color =  (new_value > this.get('initialValue') ) ?
                'green' : 'red' ;
            // store the new value
            this.set('initialValue', new_value);
            // only update the value element color
            Ember.$(this.get('element')).find('.quote-value').css('color', color);
        }
    }.observes('content.value')
});

Взгляните на jsfiddle http://jsfiddle.net/ykL69/15/

Ответ 4

Я использовал вычисляемое свойство для перехода к свойству модели и сохранил последнее значение по его набору.

registrationGroup: Em.computed('regionModel.registrationGroup', 
get:->
  @.get('regionModel.registrationGroup')
set:(key, value, oldValue)->
  @.set('lastRegistrationGroup', oldValue)
  @.set('regionModel.registrationGroup', value)
)