Перезапись события смены базовых моделей - PullRequest
8 голосов
/ 25 февраля 2012

Я думаю, что я хочу сделать довольно просто, я просто не знаю, как это сделать.Я хотел бы запустить свое собственное событие, когда один из атрибутов моей модели изменяется с целью передачи некоторых данных в обработчик события (независимо от того, было ли это изменение увеличением или уменьшением значения).

В основном я хочу свой обработчиксделать это в представлении

handler: function(increased) {
   if(increased) {
      alert("the value increased")
   }
   else {
      alert("the value decreased")
   }
}

// ...

this.model.on("change:attr", this.handler, this);

Ответы [ 3 ]

12 голосов
/ 25 февраля 2012

Вот, пожалуйста: вы в основном слушаете change:myvar. Когда происходит изменение, вы используете previous() вашей модели, чтобы получить старое значение. В зависимости от того, увеличилось оно или уменьшилось, вы запускаете соответствующее событие. Вы можете прослушать эти события, как показано в initialize().

(function($){

    window.MyModel = Backbone.Model.extend({

        initialize: function () {
            this.on('change:myvar', this.onMyVarChange);
            this.on('increased:myvar', function () {                  
                console.log('Increased');                
            });
            this.on('decreased:myvar', function () {                  
                console.log('Decreased');                
            });
        },

        onMyVarChange: function () {
            if (this.get('myvar') > this.previous('myvar')) {
                this.trigger('increased:myvar');  
            } else {
                this.trigger('decreased:myvar');
            }
        }            
    });

    window.mymodel = new MyModel({myvar: 1});
    mymodel.set({myvar: 2});
    mymodel.set({myvar: 3});
    mymodel.set({myvar: 1});

})(jQuery);​

Выполнение вышеизложенного выведет на вашу консоль «Увеличено», «Увеличено», «Понижено».

2 голосов
/ 25 февраля 2012

Просто посмотрите на previousAttributes()

Затем вы можете сравнить:

If(this.get(attr) > this.previousAttributes()[attr]){
    console.log('bigger');
} else {
    console.log('smaller');
}

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

EDIT

Это из моего проекта Backbone.Validators и способа получения списка всех атрибутов, которые были изменены на этапе проверки:

var get_changed_attributes = function(previous, current){
    var changedAttributes = [];
    _(current).each(function(val, key){
        if(!_(previous).has(key)){
            changedAttributes.push(key);
        } else if (!_.isEqual(val, previous[key])){
            changedAttributes.push(key);
        }
    });
    return changedAttributes;
};

Для этого требуется Underscore 1.3.1, поскольку он использует _.has.Если вы не можете обновить, это легко заменить.В вашем случае вы бы проходили this.previousAttributes() и this.attributes

0 голосов
/ 25 февраля 2012

Что если вы запустите собственное событие после прослушивания события change?

handler: function(increased) {
   this.model.trigger('my-custom-event', stuff, you, want);
},
myHandler: function(stuff, you, want){
    // Do it...
}
// ...
this.model.on("change:attr", this.handler, this);
this.model.on('my-custom-event, this.myHandler, this);
...