2013-11-11 2 views
7

Если я хочу добавить нестандартное свойство к моей базовой модели, лучше ли это сделать это? Есть ли лучший способ или совершенно другой подход к функциональности, которую я хочу достичь?defineProperty on Backbone model

var myModel = Backbone.Model.extend({ 

    defaults:{ 
    monthly_amount: 100 
    }, 

    initialize: function(model, options){ 

    var m = this; 

    Object.defineProperty(this,"yearly_amount",{ 
     get: function() { 
         return (m.get("monthly_amount") * 12); 
         }, 
     set: function(value) { 
         m.set("monthly_amount", (value/12)); 
         } 
    }); 

    } 
}); 

Спасибо!

Редактировать: свойство «виртуально», я не хочу, чтобы оно находилось в атрибутах модели при сохранении модели на сервере.

+0

просто перекрывая Будет ли сохранить только те поля, которые вы хотите выбрать? http://jsfiddle.net/hEN88/1/ – Josh

+0

Не так, потому что yearly_amount не всегда будет в правильном отношении к Monthly_amount, если я добавлю его как отдельный атрибут и просто исключим его в метод сохранения. – homtg

+0

Когда я хочу переходное поле в модели, я просто создаю поле для самого объекта. Затем я добавляю то, что мне нужно во время выполнения в этом поле, и создаю funtions, чтобы иметь дело с ним вместо вызова set/get модели. – Joqus

ответ

2

Таким образом, общая проблема здесь часто упоминается как «вычисленные свойства», и для этого есть плагины для магистрали (см. Ниже). Backbone использует стиль вызова get/set, а не стиль defineProperty, поэтому ваш подход сделает вычисления вычислений непрозрачными для просмотра и, таким образом, станет довольно сильным отходом от дизайна базовой линии. Плагин, который поддерживает надлежащие интерфейсы get/set и change, будет поддерживать базовый API-интерфейс модели, поэтому в представлении не нужно рассматривать этот конкретный атрибут модели по-разному.

См. Также backbone wiki of plugins.

Доступные плагины:

+0

https://github.com/alexanderbeletsky/backbone-computedfields – Josh

0

Когда вы установите свойство по умолчанию роекта, он идет к атрибутам, но это Безразлично» t нас. Поскольку Магистральная модель является регулярным объектом, вы можете получить доступ к его свойства, как к объектам недвижимости:

var myModel = Backbone.Model.extend({}), 
    model = new myModel(); 

model.monthly_amount = 50; 
console.log(model.monthly_amount) 

или создать и присваивателя, как это:

var myModel = Backbone.Model.extend({ 
    setMonthlyAmount: function (value) { 
     this.monthly_amount = value; 
    }, 

    getMonthlyAmount: function() { 
     return this.monthly_amount; 
    } 

}); 

//access with getter/setter 
var model = new myModel(); 

model.setMonthlyAmount(20); 
var result = model.getMonthlyAmount(); 
console.log(result); 

Working example on jsfiddle

Смежные вопросы