1

私はbackbone.js チュートリアルに従っていますが、2 つの関数initialize()render(). initialize()使用$(self.el).append()中にいくつかの html を追加するときにrender()使用され$(this.el).append()ます。私は違いについて混乱しています、説明をいただければ幸いです、ありがとう!

JS コード

// Views
window.WineListView = Backbone.View.extend({

    tagName:'ul',

    initialize:function () {
        this.model.bind("reset", this.render, this);
        var self = this;
        this.model.bind("add", function (wine) {
            $(self.el).append(new WineListItemView({model:wine}).render().el);
        });
    },

    render:function (eventName) {
        _.each(this.model.models, function (wine) {
            $(this.el).append(new WineListItemView({model:wine}).render().el);
        }, this);
        return this;
    }
});
4

2 に答える 2

4

1 つ目は、イベントが発生したときにスコープが変更されたときにself参照を保持するために使用します。this匿名関数内 (イベント ハンドラー用) はthis、バックボーン コントローラーではなく、イベントを発生させた要素を参照します。

2 番目のケースでは参照は必要ありません。

于 2012-06-13T12:26:06.040 に答える
3

その理由は、JavaScript がスコープを処理する方法にあります。

彼らが行う初期化関数で

var self = this;

したがって、初期化が呼び出された WineListView インスタンスへの参照をバインドするとき

this.model.bind("add", function (wine) {
    $(self.el).append(new WineListItemView({model:wine}).render().el);
 });

ただし、3 番目のパラメーターとして「this」を送信すると、self 変数がなくても実行できます。3 番目のパラメーターは、コールバックを呼び出すスコープを指定する必要があります。

this.model.bind("add", function (wine) {
    $(this.el).append(new WineListItemView({model:wine}).render().el);
 }, this);

render is bind を見ると、3 番目のパラメータも使用されます。

this.model.bind("reset", this.render, this);

免責事項私はコードを試したことはありませんが、バックボーンのドキュメントを読んでこれを得ました http://backbonejs.org/#FAQ-this

于 2012-06-13T12:38:44.853 に答える