バックボーン。「el」の混乱を表示


97

ビューはどのように処理する必要がありますelか?設定する必要があります。そうしないと、イベントは発生しません(ここを参照)。

しかし、それはすでにページ上にある要素であるべきでしょうか?私のアプリでは、(jQueryテンプレート)テンプレートをFancyboxにレンダリングします。elその場合、何をすべきでしょうか?


11
私は思った-私はel事をいじる唯一の人です。
Yugal Jindle 2013年

elのようgfです。それらを完全に理解することはできません。
Mahi

回答:


121

ビューelは、すべてのイベントバインディングが行われる場所です。これを使用する必要はありませんが、バックボーンにイベントを発生させたい場合は、elでレンダリング作業を行う必要があります。ビューelはDOM要素ですが、既存の要素である必要はありません。これは、現在のページからプルしない場合に作成されますが、何かを実行したい場合は、ページに挿入する必要があります。

例:個別のアイテムを作成するビューがあります

window.ItemView = Backbone.View.extend({
    tagName: "li", //this defaults to div if you don't declare it.
    template: _.template("<p><%= someModelKey %></p>"),
    events: {
         //this event will be attached to the model elements in
         //the el of every view inserted by AppView below
        "click": "someFunctionThatDoesSomething"
    },
    initialize: function () { 
        _.bindAll(this, "render");
        this.render();
    },
    render: function () {
        this.el.innerHTML = this.template(this.model.toJSON());
        return this;
    }
});
window.AppView = Backbone.View.extend({
    el: $("#someElementID"), //Here we actually grab a pre-existing element
    initialize: function () { 
        _.bindAll(this, "render");
        this.render(new myModel());
    },
    render: function (item) { 
        var view = new ItemView({ model: item });
        this.el.append(view.render().el);
    }
});

最初のビューは単にリストアイテムを作成し、2番目のビューは実際にそれらをページに配置します。これは、backbone.jsサイトのToDoの例で起こることとかなり似ていると思います。慣習はあなたにエルを満足させることだと思います。したがって、elはテンプレート化されたコンテンツを配置するためのランディングプレースまたはコンテナとして機能します。次に、バックボーンはそのイベントを内部のモデルデータにバインドします。

ビューを作成するときは、使用して4つの方法でエルを操作することができel:tagName:className:、とid:。これらのどれも宣言されていない場合、elはデフォルトでidまたはクラスのないdivになります。また、この時点ではページに関連付けられていません。tagNameを使用して、タグを別のタグに変更できます(たとえばtagName: "li"、el ofを与えます<li></li>)。同様に、elのIDとクラスを設定できます。それでも、elはページの一部ではありません。elプロパティを使用すると、elオブジェクトを非常に細かく操作できます。ほとんどの場合、私はel: $("someElementInThePage")これは実際に、ビューでelに対して行うすべての操作を現在のページにバインドします。それ以外の場合、ビューで実行したすべてのハードワークをページに表示するには、ビューの別の場所(おそらくレンダリング)にページを挿入/追加する必要があります。elは、すべてのビューが操作するコンテナーとして考えるのが好きです。


説明と例をありがとう!特定の状況でelがどうあるべきかが常に明確であるとは限らないと私は思います、そして、開発者はそれに対する "感触"を得なければなりません。あなたの説明は確かに役に立ちました!ただし、1つの質問:elをItemViewで定義するのではなく、render関数でアクセスします。これは機能しますか?明示的に定義しない場合、ある種のデフォルトのelはありますか?
Manuel Meurer、2011

3
デフォルトでは、elはIDまたはクラスのない「div」タグです。これは、ページDOMにバインドされていないDOMオブジェクトです。通常は、レンダリング機能または親ビューのレンダリング機能でページに挿入/追加します。
LeRoy、2011

elを定義するプロパティのいくつかの説明で私の回答を更新しました。
LeRoy、2011

5
既存の要素をel:$( "#someElementID")で取得することに関する私の唯一の問題は、ビューがおそらく必要以上に知っているため、再利用が困難になると思います。「... DOMからデカップルビュー」を参照してくださいcoenraets.org/blog/2012/01/...
スコット・コーツ

@scoarescoareインスタンス化時にelプロパティを追加しているので、ビュー自体は実際に必要以上の情報を持っているわけではなく、モジュールのままであり、渡す$(el)を受け入れることができます。ですから、これは本当に再利用可能にします。
メタグラファー、2012年

6

少し古くなりましたが、私も混乱していました。そのため、ここに来た他の人々にとって、このフィドルは役立つかもしれません-http://jsfiddle.net/hRndn/2/

var MyView = Backbone.View.extend({

    events: {
        "click .btn" : "sayHello",
    },

    sayHello : function() {
        alert("Hello");
    },


    render : function() {
        this.$el.html("<input type='button' class='btn' value='Say Hello'></input>");

    }
});

$(function() {
    myView = new MyView({el:"#parent_id"});
    myView.render();
});

私はこのモデルに従ってきましたが、従わなかったといいのですが。ビューを破棄してバインディングを削除するには、バックボーンの規則はview.remove()です。これにより$ elが破棄され、DOMから削除されるため、ビューを再度表示する必要がある場合、$ elは存在しません。
JJ

@Mark what私がマリオネットのような複合アーキテクチャを使用している場合...それでもビューのelが必要ですか?
afr0 2013年


@まひそうそうです。間違ったリンクを貼り付けたのでしょう。これは動作します:jsfiddle.net/hRndn/127
Izzy

1

'el'が、ビューの変更をトリガーするイベントを持つ子要素を含む要素を参照するようにします。「body」タグと同じ幅にすることができます。


うーん、それは本当にそれを明確にするものでもありません。ほとんどの場合、ビューの変更をトリガーする可能性のある要素は、ビューがレンダリングするテンプレート内にあるため、レンダリングされる前に、これらの要素はまだ存在していません。
Manuel Meurer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.