观察者如何在Ember.js中找出被观察属性的前后值?

时间:2012-02-10 21:04:54

标签: ember.js

请参阅ud3323提供的另一个问题的解决方案:http://jsfiddle.net/ud3323/ykL69/。此解决方案使用红色突出显示更改的值。我有一个额外的要求:如果该值增加了绿色突出显示,如果它的红色突出显示为红色。为此,我需要知道观察者中的旧值和新值。有没有办法做到这一点?

P.S。余烬文档没有说明观察者功能中可用的内容。我从示例中可以看出,由于观察者是在itemRowView中定义的,因此“this”指向itemRowView。

4 个答案:

答案 0 :(得分:16)

在Ember 1.10中,

beforeObserverdeprecated

相反,请使用手动缓存:

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);
})

答案 1 :(得分:12)

看看beforeObserver。在属性更改之前,beforeObserver会触发。因此,如果您在beforeObserver中get属性,则您将拥有更改前的值。您可以使用Ember.addBeforeObserverobservesBefore函数原型扩展来设置此类观察者。

这将为您提供实现目标所需的一切。我已经基于你的小提琴创建了以下JSBin来演示这个:http://emberjs.jsbin.com/qewudu/2/edit

2014-10-07更新以反映Ember 1.7.x中的行为。

2015-02更新:beforeObserver已被弃用。请参阅此问题的其他答案。

答案 2 :(得分:2)

使用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/

答案 3 :(得分:0)

我使用了计算属性来路由到模型的属性,并将最后一个值存储在它的集合中。

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