7

如果我想向我的主干模型添加自定义属性,这是最好的做法吗?我想要实现的功能是否有更好的方法或完全不同的方法?

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

   }
});

谢谢!

编辑:该属性只是“虚拟的”,当将模型保存到服务器时,我不希望它在模型属性中。

4

2 回答 2

2

所以这里的一般问题通常被称为“计算属性”,并且有提供这个的主干插件(见下文)。Backbone 使用get/set方法调用样式而不是defineProperty样式,因此您的方法会使值计算对视图不透明,因此与骨干的设计有很大的不同。维护正确get/setchange接口的插件将维护基本模型 API,因此视图不必区别对待这个特定的模型属性。

另请参阅插件的主干 wiki

可用插件:

于 2013-11-11T15:03:00.307 回答
0

当您将属性设置为默认对象时,它会转到属性,但它不适合我们。由于 Backbone 模型是一个常规对象,因此您可以访问它的对象属性:

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

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

或者像这样创建setter和getter:

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

jsfiddle 上的工作示例

于 2013-11-11T15:43:08.023 回答