7

这可能是一个非常简单的问题,但我很难找到答案。

使用主干,我有这条线:

Person = Backbone.Model.extend();

然后我在从 URL 填充的集合中使用它。为了这个例子,假设我有一个名字和姓氏,我想做一些类似的事情:

Person = Backbone.Model.extend({
    FullName: this.get("firstName") + " " + this.get("lastName")
});

例如,我可以使用 People.first().FullName() 将其称为内部主干。但是,如果我将 People.first() 传递给我的视图并在模板中呈现它,它似乎不知道 FullName 是什么。

如何将自定义属性添加到 Backbone 中的模型并在模板中使用它?

干杯!

4

5 回答 5

14

你的FullName定义没有任何意义,所以我假设你真的是这个意思:

Person = Backbone.Model.extend({
    FullName: function() {
        return this.get("firstName") + " " + this.get("lastName");
    }
});

通常你会调用toJSON你的模型来序列化它们以供模板使用:

var html = template({ person: person.toJSON() })

默认toJSON只返回模型内部属性的(浅)副本。属性可能同时具有firstNamelastName属性,但FullName它是模型上的一个函数,因此它不会出现在属性中。

您可以提供自己的toJSON

toJSON: function() {
    var j = _(this.attributes).clone();
    j.FullName = this.FullName();
    return j;
}

然后你FullName的模板中有一个。但是,toJSON也用于序列化模型向服务器发送数据;您的服务器最终会看到 aFullName并且可能会对此感到不安。您可以专门为模板添加另一个序列化程序:

// `serialize` is another common name for this
for_template: function() {
    var j = this.toJSON();
    j.FullName = this.FullName();
    return j;
}

然后使用该函数为您的模板提供数据:

var html = template({ person: person.for_template() });
于 2012-05-28T03:45:43.453 回答
4

我也为此苦苦挣扎了一段时间,但我找到了解决方案。

它涵盖了相当多的深度,包括解决 toJSON 用于发送服务器数据的问题,在Backbone Computed Properties

于 2013-09-05T00:50:33.303 回答
1
var Person = Backbone.Model.extend({
    parse: function (model) {
        model.FullName = model.FirstName + ' ' + model.LastName;
        return model;
    }
});
于 2013-04-27T19:26:01.200 回答
0

还有一个更简单的方法。将您的方法包含在您的初始化方法中。当你实例化你的模型时,你的所有方法也会被实例化。

var model = Backbone.Model.extend({
 initialize : function(){
      this.myCustomMethod = function(){ return 'Something'; };
 },
 idAttribute : 'id',
 urlRoot : ''
 });
于 2013-09-28T09:57:34.343 回答
0

完全不同的解决方法:

Backbone.Model.extend({
  defaults: function() {
    this.set('fullName', this.fullName.bind(this))
  },

  fullName: function() {
    return this.get('firstName') + this.get('lastName');
  }
});

这样可以直接在模型上调用“fullName”函数

model.fullName()

或通过get函数,允许从模板调用它:

model.get('fullName')()
于 2014-12-07T17:29:26.683 回答