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テンプレートに a があります。ただし、toJSONモデルをシリアライズしてサーバーにデータを送信するためにも使用されます。あなたのサーバーは最終的に を見てFullName、それについて動揺するかもしれません. テンプレート専用の別のシリアライザーを追加できます。

// `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

私もこれにしばらく苦労しましたが、解決策を見つけました。

Backbone Computed Propertiesで、サーバー データの送信に使用されている toJSON の問題の解決策を含む、かなりの深さでカバーされています。

于 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

かなり異なる回避策:

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 に答える