2015-04-25 6 views
0

Мне нужно добавить функцию для всех моих моделей, но я не могу распознать модель как «эту» переменную области видимости. Моя функция будет делать свою модель может быть сброшена на значения по умолчанию и некоторые данные-объект в качестве параметра:Как добавить глобальную функцию Backbone Model

Backbone.Model.prototype.reset = function(data){ 

     this.set(this.defaults); 

     $.each(data, function(key, value){ 

       this.set(key, value); 
     }); 
} 

ответ

4

Вашего код кажется законным. значение this определено во время выполнения и зависит от способа вызова метода. если вы будете использовать modelInstance.reset(), значение this будет modelInstance.

Однако мутация прототипа третьего лица считается плохой практикой, которой следует избегать. Лучшей практикой является создание абстрактной модели и ее реализация.

Это будет выглядеть примерно так:

var AbstracrtModel = Backbone.Model.extend({ 
    reset: function (data, options) { 
    this.clear(options); 
    this.set(_.defaults({}, data || {}, this.defaults || {}), options); 
    } 
}); 

АНИ из model.set разрешений, проходящих хэш данных, так что вы на самом деле не нужен внутренний цикл.

2

Ваш «этот» контекст внутри $ .each - это итератор. Вы можете получить

var self = this; 
$.each(data, function(key, value){ 
    self.set(key, value); 
}); 

И использовать self внутри каждой функции или привязать контекст к функции.

$.each(data, function(key, value){ 
    this.set(key, value); 
}.bind(this));